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

               ConnectNamedPipe-функция дает возможность серверным процессам именованного канала ожидать клиентских процессов для соединения с экземпляром именованного канала. Клиентские процессы соединяются вызовом либо CreateFile , либо CallNamedPipe функцией.

BOOL ConnectNamedPipe(
HANDLEhNamedPipe,          // управление именованному каналу для соединения
LPOVERLAPPEDlpOverlapped   // указатель на структуры overlapped. 
);
 
Параметры:
 

hNamedPipe – дескриптор  экземпляра именованного канала серверной части.

Этот дескриптор –  возвращаемое значение функцией CreateNamedPipe

lpOverlapped – указатель на структуру OVERLAPPED.

Возвращаемые значения:
Если функция удачна, возвращаемое значение – отличное от нуля.
Если функция неудачна, возвращаемое значение – нуль. Для получения более детальной информации вызовите GetLastError.

DisconnectNamedPipe

Функция DisconnectNamedPipeотсоединяет экземпляра именованного канала серверной части.

BOOL DisconnectNamedPipe(
HANDLEhNamedPipe   // дескриптор именованного канала
);
 
Параметры:

hNamedPipe – дескриптор экземпляра именованного канала. Этот дескриптор (handle) должен быть создан функцией CreateNamedPipe.

 
Возвращаемые значения:
Если функция удачна, возвращаемое значение – отличное от нуля.
Если функция неудачна, возвращаемое значение – нуль. Для получения более детальной информации вызовите GetLastError.
 

Программа «клиент»: Client.cpp:

// Client.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include <windows.h>

#include <stdio.h>

#include <conio.h>

LPSTR   lpszPipeName = "\\\\.\\pipe\\simple";

//Два буфера для приема и для передачи

char   outbuf[80];

char    inbuf[80];

DWORD   bytesRead;

int main(int argc, char* argv[])

{

               printf("String 1 sending to server>");

               scanf("%s",outbuf);

                BOOL ret = CallNamedPipe(lpszPipeName,

                         outbuf, sizeof(outbuf),

                         inbuf, sizeof(inbuf),

                         &bytesRead, NMPWAIT_WAIT_FOREVER);

    if (!ret) {

        printf("client: CallNamedPipe failed, GetLastError = %d\n", GetLastError());

                              getch();

        exit(1);

    }

    printf("\nclient: received 1\"%s\"\n", inbuf);

               printf("String 2 sending to server>");

               scanf("%s",outbuf);

               //для каждой из передач вызываем CallNamedPipe

               //           

                ret = CallNamedPipe(lpszPipeName,

                         outbuf, sizeof(outbuf),

                         inbuf, sizeof(inbuf),

                         &bytesRead, NMPWAIT_WAIT_FOREVER);

    if (!ret) {

        printf("client: CallNamedPipe failed, GetLastError = %d\n", GetLastError());

                              getch();

        exit(1);

    }

    printf("\nclient: received 2\"%s\"\n", inbuf);

getch();

               return 0;

}

Server.cpp:

#include "stdafx.h"

#include <windows.h>

#include <stdio.h>

#include <conio.h>

LPSTR   lpszPipeName = "\\\\.\\pipe\\simple";

SECURITY_ATTRIBUTES     sa;

PSECURITY_DESCRIPTOR    pSD = NULL;

HANDLE                  hPipe = INVALID_HANDLE_VALUE;

OVERLAPPED              os;

TCHAR                   szIn[80];

TCHAR                   szOut[80];

    DWORD                   cbRead;

    DWORD                   cbWritten;

    DWORD                   dwWait;

    HANDLE                  hEvent = NULL;

    BOOL                    bRet;

int main(int argc, char* argv[])

{

               pSD = (PSECURITY_DESCRIPTOR) malloc( SECURITY_DESCRIPTOR_MIN_LENGTH );

    if (pSD == NULL)

               {

                                            printf("Failed to malloc SD");

                                goto cleanup;

                                }

    if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))

               {

                                            printf("Failed to initialize SD");

                              goto cleanup;

               }