// Цикл обмена данными с серверным процессом
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.