Именованные каналы для двунаправленного межпроцессного обмена нетипизированными данными между двумя Windows-машинами, страница 4

    // 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