// add a NULL disc. ACL to the security descriptor.
//
if (!SetSecurityDescriptorDacl(pSD, TRUE, (PACL) NULL, FALSE))
{
printf("Failed to Set SD");
goto cleanup;
}
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = TRUE;
hPipe = CreateNamedPipe(
lpszPipeName , // имя канала
FILE_FLAG_OVERLAPPED |
PIPE_ACCESS_DUPLEX, // режим открытия канала
PIPE_TYPE_MESSAGE |
PIPE_READMODE_MESSAGE |
PIPE_WAIT, // канал типа IO
1, // количество экземпляров
0, // размер outbuf (0 == allocate as necessary)
0, // размер inbuf
1000, // default time-out значение
&sa); // атрибуты безопасности
if (hPipe == INVALID_HANDLE_VALUE) {
printf("Failed to create named pipe");
goto cleanup;
}
hEvent = CreateEvent(
NULL, // нет атрибутов безопасности
TRUE, // руководство reset событий
FALSE, // not-signalled
NULL); // no name
if ( hEvent == NULL)
{
printf("Failed to create event");
goto cleanup;
}
while ( 1 )
{
// инициализация overlapped-структуры
//
memset( &os, 0, sizeof(OVERLAPPED) );
os.hEvent = hEvent;
ResetEvent( hEvent);
// ожидание соединения.
//
ConnectNamedPipe(hPipe, &os);
if ( GetLastError() == ERROR_IO_PENDING )
{
dwWait = WaitForMultipleObjects( 1, &hEvent, FALSE, INFINITE );
if ( dwWait != WAIT_OBJECT_0) // not overlapped i/o event - error occurred,
break; // or server stop signaled
}
// инициализация overlapped-структуры
//
memset( &os, 0, sizeof(OVERLAPPED) );
os.hEvent = hEvent;
ResetEvent( hEvent);
// попытка схватить все пришедшее через канал
//
bRet = ReadFile(
hPipe, // файл, от куда читать
szIn, // адрес вводимого буфера
sizeof(szIn), // кол-во байт для чтения
&cbRead, // кол-во считанных байт
&os); // не нужно
if ( !bRet && ( GetLastError() == ERROR_IO_PENDING ) )
{
dwWait = WaitForMultipleObjects( 1, &hEvent, FALSE, INFINITE );
if ( dwWait != WAIT_OBJECT_0+1 ) // не overlapped i/o событие - ошибка,
break; // или сервер прекратил сигналы
}
sprintf(szOut, "Server received %s", szIn);
memset( &os, 0, sizeof(OVERLAPPED) );
os.hEvent = hEvent;
ResetEvent( hEvent );
// отослать обратно
//
bRet = WriteFile(
hPipe, // файл, куда писать (имеется ввиду канал, а не файл)
szOut, // адрес output буфера
sizeof(szOut), // кол-во байт для чтения
&cbWritten, // кол-во записанных байт
&os); // overlapped stuff, not needed
if ( !bRet && ( GetLastError() == ERROR_IO_PENDING ) )
{
dwWait = WaitForMultipleObjects( 1,&hEvent, FALSE, INFINITE );
if ( dwWait != WAIT_OBJECT_0 ) // not overlapped i/o event - error occurred,
break; // or server stop signaled
}
// отсоединиться
//
DisconnectNamedPipe(hPipe);
}
cleanup:getch();
return 0;
}
На экране:
Рис.1
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.