命名管道
来源:互联网 发布:网络电话软件 编辑:程序博客网 时间: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
- 命名管道
- 命名管道
- 命名管道
- 命名管道
- 命名管道
- 命名管道
- 命名管道
- 命名管道
- 命名管道
- 命名管道
- 命名管道
- 命名管道
- 命名管道
- 命名管道
- 命名管道
- 命名管道
- 命名管道
- 命名管道
- 编写数据库函数执行循环copy命令导入大数据
- Unity中的序列化
- 运算符重载(一)
- spring跟QuartZ整合
- 黑马程序员_JAVA_集合框架(一)
- 命名管道
- Android自动清理无用资源工具
- 腾讯:工作感想
- Linux下grep命令详解
- poj 2065 SETI(数学:高斯消元)
- 姜太公钓鱼:所有的人都上钩
- hi,我是一段代码段
- Xcode6中自动布局autolayout和sizeclass的使用
- mac 系统下eclipse 配置文件