рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

DisconnectNamedPipe

DisconnectNamedPipe - раздел Образование, Тема: Взаимодействие процессов через механизм именованых каналов Функция DisconnectnamedpipeОтсоединяет Экземпляра Именованно...

Функция 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 = %dn", 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 = %dn", 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;

}

 

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

 

– Конец работы –

Эта тема принадлежит разделу:

Тема: Взаимодействие процессов через механизм именованых каналов

Тема Взаимодействие процессов через механизм именованых каналов... Цель Научиться передавать данные и сообщения между процессами локального и...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: DisconnectNamedPipe

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

CallNamedPipe
CallNamedPipe – функция CallNamedPipe соединяется с сообщением-типом канала (и ждет, если экземпляр канала недоступен). Считывает в канал и записывает с канала, а потом закрывает канал. Оп

CreateNamedPipe
CreateNamedPipe-функция создает экземпляр именованного канала и возвращает дескриптор следующим операциям канала. Именованный канал серверного процесса использует эту функцию либо

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

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги