Программирование для Windows NT (том 2)


         

Приложение PIPEС - часть 2


  // Цикл обмена данными с серверным процессом

  while(1)

  {

    // Выводим приглашение для ввода команды

    printf("cmd>");

   

    // Вводим текстовую строку

    gets(szBuf);

    // Передаем введенную строку серверному процессу

    // в качестве команды

    if(!WriteFile(hNamedPipe, szBuf, strlen(szBuf) + 1,

      &cbWritten, NULL))

      break;

   

    // Получаем эту же команду обратно от сервера

    if(ReadFile(hNamedPipe, szBuf, 512, &cbRead, NULL))

      printf("Received back: <%s>\n", szBuf);

   

    // Если произошла ошибка, выводим ее код и

    // завершаем работу приложения

    else

    {

      fprintf(stdout,"ReadFile: Error %ld\n",

        GetLastError());

      getch();

      break;

    }

   

    // В ответ на команду "exit" завершаем цикл

    // обмена данными с серверным процессом

    if(!strcmp(szBuf, "exit"))

      break;

  }

  // Закрываем идентификатор канала

  CloseHandle(hNamedPipe);

  return 0;

}

Сразу после запуска приложение PIPEC проверяет количество аргументов командной строки. Если при запуске пользователь задал в качестве параметра имя рабочей станции, то это имя вставляется внутрь строки, задающей имя канала Pipe, как это показано ниже:

if(argc > 1)

  sprintf(szPipeName, "\\\\%s\\pipe\\$MyPipe$", argv[1]);

Если же при запуске имя рабочей станции не указано, клиентское приложение будет открывать локальный канал с локальным именем:

else

  strcpy(szPipeName, "\\\\.\\pipe\\$MyPipe$");

При использовании любого варианта для открытия канала используется функция CreateFile:

hNamedPipe = CreateFile(

  szPipeName, GENERIC_READ | GENERIC_WRITE,

  0, NULL, OPEN_EXISTING, 0, NULL);

Так как мы указали константы GENERIC_READ и GENERIC_WRITE, канал открывается и на чтение, и на запись.

После открытия канала запускается цикл ввода и передачи команд:

while(1)

{

  printf("cmd>");

  gets(szBuf);

  if(!WriteFile(hNamedPipe, szBuf, strlen(szBuf) + 1,

    &cbWritten, NULL))

    break;

  if(ReadFile(hNamedPipe, szBuf, 512, &cbRead, NULL))

    printf("Received back: <%s>\n", szBuf);

  else

  {

    fprintf(stdout,"ReadFile: Error %ld\n",

      GetLastError());

    getch();

    break;

  }

  if(!strcmp(szBuf, "exit"))

    break;

}

Для ввода команд используется известная вам функция gets. Введенная команда посылается серверу функцией WriteFile. Сразу после этого наше приложение вызывает функцию ReadFile чтобы получить от сервера эту же команду обратно.

В случае успеха команда сравнивается со строкой exit. Если пользователь ввел эту строку, клиентское приложение завершает свою работу. Аналогично поступает и серверное приглашение PIPES.




Содержание  Назад  Вперед