ConnectNamedPipe-функция дает возможность серверным процессам именованного канала ожидать клиентских процессов для соединения с экземпляром именованного канала. Клиентские процессы соединяются вызовом либо CreateFile , либо CallNamedPipe функцией.
BOOL
ConnectNamedPipe(
HANDLE
hNamedPipe, // управление именованному каналу для соединения
LPOVERLAPPED
lpOverlapped // указатель на структуры
overlapped.
);
Параметры:
hNamedPipe – дескриптор экземпляра именованного канала серверной части.
Этот дескриптор – возвращаемое значение функцией CreateNamedPipe
lpOverlapped – указатель на структуру OVERLAPPED.
Возвращаемые значения:
Если функция удачна, возвращаемое значение – отличное от нуля.
Если функция неудачна, возвращаемое значение – нуль. Для получения более детальной информации вызовите GetLastError.
Функция DisconnectNamedPipeотсоединяет экземпляра именованного канала серверной части.
BOOL
DisconnectNamedPipe(
HANDLE
hNamedPipe // дескриптор именованного канала
);
Параметры
:
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;
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.