命名管道

来源:互联网 发布:网络电话软件 编辑:程序博客网 时间:2024/05/29 21:33

服务端:

(1)CreateNamedPipe返回句柄,两种类型message或者是字节流

(2)ConnectNamedPipe函数等待客户端连接,阻塞在此函数上

(3)有客户端连入以后,会继续向下执行,使用ReadFile\WriteFile来发送和接收数据。

(4)使用DisconnectNamedPipe关闭命名管道、再使用ClosheHandle关闭句柄

客户端:

(1)使用WaitNamedPipe函数等待命名管道的服务器创建,阻塞模式,有检测到有此命名管道后,则继续向下执行。

(2)使用CreateFile将命名管道打开。设置操作的权限

(3)使用ReadFile、WriteFile进行命名管道的读写

(4)使用DisconnectNamedPipe关闭命名管道、再使用ClosheHandle关闭句柄


代码:

// TestPipe.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "TestPipe.h"#include <iostream>#include <string>using namespace std;#ifdef _DEBUG#define new DEBUG_NEW#endif// 唯一的应用程序对象CWinApp theApp;using namespace std;bool g_isServer = true;static TCHAR* ServerPipeName = L"\\\\.\\pipe\\ISServerIsPipeName";enum{PIPE_SET_START = 0,PIPE_SET_STOP,PIPE_GET_SERVICE_STATUS};int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){int nRetCode = 0;if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)){_tprintf(_T("错误: MFC 初始化失败\n"));nRetCode = 1;}else{}cout<<"y or n ?"<<endl;char c = getchar();(c == 'y') ? (g_isServer = true) : (g_isServer = false);if (g_isServer){cout<<"pipe server have started: "<<endl;HANDLE hServerPipe = CreateNamedPipe(ServerPipeName,PIPE_ACCESS_DUPLEX,PIPE_TYPE_MESSAGE,1,0,0,1000,NULL);if (hServerPipe == INVALID_HANDLE_VALUE){MessageBox(NULL,L"server CreateNamedPipe Error",L"",MB_OK);return -1;}if (ConnectNamedPipe(hServerPipe,NULL) == FALSE ){CloseHandle(hServerPipe);MessageBox(NULL,L"server ConnectNamedPipe Error",L"",MB_OK);return -1;}while(1){//readCHAR szBuf[MAX_PATH];ZeroMemory(szBuf,sizeof(CHAR)*MAX_PATH);DWORD dwReq;if (ReadFile(hServerPipe,szBuf,sizeof(szBuf),&dwReq,NULL) == FALSE){CloseHandle(hServerPipe);MessageBox(NULL,L"server ReadFile Error",L"",MB_OK);return -1;}else{szBuf[dwReq] = L'\0';cout<<"ServerRead data:"<<szBuf<<endl;}//////////////////////////////////////////////////////////////////////////string sSend;CHAR szSend[MAX_PATH];ZeroMemory(szSend,sizeof(CHAR)*MAX_PATH);cin>>szSend;sSend.assign(szSend);DWORD dwSendLen;if (WriteFile(hServerPipe,sSend.c_str(),sSend.length(),&dwSendLen,NULL) == FALSE){CloseHandle(hServerPipe);MessageBox(NULL,L"Server WriteFile Error",L"",MB_OK);return -1;}}//while..//closeif (DisconnectNamedPipe(hServerPipe)){CloseHandle(hServerPipe);MessageBox(NULL,L"server DisconnectNamedPipe OK",L"",MB_OK);}}else{cout<<"pipe client wait for start: "<<endl;while(1){if (WaitNamedPipe(ServerPipeName,2000/*NMPWAIT_WAIT_FOREVER*/)){break;}}cout<<"pipe client have started: "<<endl;HANDLE hClientPipe = CreateFile(ServerPipeName,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if (hClientPipe == INVALID_HANDLE_VALUE){MessageBox(NULL,L"client CreateFile open pipe Error",L"",MB_OK);return -1;}while (1){string sSend;CHAR szSend[MAX_PATH];ZeroMemory(szSend,sizeof(CHAR)*MAX_PATH);cin>>szSend;sSend.assign(szSend);DWORD dwSendLen;if (WriteFile(hClientPipe,sSend.c_str(),sSend.length(),&dwSendLen,NULL) == FALSE){CloseHandle(hClientPipe);MessageBox(NULL,L"client WriteFile Error",L"",MB_OK);return -1;}//////////////////////////////////////////////////////////////////////////CHAR szBuf[MAX_PATH];ZeroMemory(szBuf,sizeof(CHAR)*MAX_PATH);DWORD dwReq;if (ReadFile(hClientPipe,szBuf,sizeof(szBuf),&dwReq,NULL) == FALSE){CloseHandle(hClientPipe);MessageBox(NULL,L"server ReadFile Error",L"",MB_OK);return -1;}else{szBuf[dwReq] = L'\0';cout<<"Client Read data:"<<szBuf<<endl;}}CloseHandle(hClientPipe);}return nRetCode;}


0 0