进程通信系列-命名管道

来源:互联网 发布:广东省大数据管理局 编辑:程序博客网 时间:2024/04/29 09:22
命名管道作为一种通信方法,有其独特的优越性,这主要表现在它不完全依赖于某一种协议,而是适用于任何协议——只要能够实现通信。
  命名管道具有很好的使用灵活性,表现在:
  1) 既可用于本地,又可用于网络。
  2) 可以通过它的名称而被引用。
  3) 支持多客户机连接。
  4) 支持双向通信。

  5) 支持异步重叠I/O操作。

代码长度长

命名管道类

#include "stdafx.h"#include "guandao.h"guandao::guandao(void){hpipe=NULL;flag=0;}guandao::~guandao(void){if(hpipe)CloseHandle(hpipe);}int guandao::free(){CloseHandle(hpipe);hpipe=NULL;return 1;}int guandao::have(){if(!hpipe)return 0;char  szOutput[1024+10];DWORD  cntReadedChar=0;long a=PeekNamedPipe(hpipe, szOutput, 1, &cntReadedChar, NULL, 0);if(szOutput[0] ==-52) return 0;return 1;}int guandao::create(CString sever,CString name ){hpipe=CreateNamedPipe("\\\\"+sever+"\\pipe\\"+name,PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,0,1,1024,1024,500,NULL);if(hpipe==INVALID_HANDLE_VALUE){MessageBox(NULL,"创建命名管道"+name+"失败","error",MB_ICONERROR);hpipe=NULL;return 0;}//创建匿名人工重置对象HANDLE hevent;hevent=CreateEvent(NULL,true,false,NULL);if(!hevent){MessageBox(NULL,"创建事件对象失败","error",MB_ICONERROR);CloseHandle(hpipe);hpipe=NULL;return 0;}OVERLAPPED ovlap;ZeroMemory(&ovlap,sizeof(OVERLAPPED));ovlap.hEvent=hevent;MessageBox(NULL,"等待客户端","ok",MB_ICONINFORMATION);if(!ConnectNamedPipe(hpipe,&ovlap)){if(ERROR_IO_PENDING!=GetLastError()){MessageBox(NULL,"等待客户端失败","error",MB_ICONERROR);CloseHandle(hpipe);CloseHandle(hevent);hpipe=NULL;return 0;}}if(WAIT_FAILED==WaitForSingleObject(hevent,INFINITE)){MessageBox(NULL,"等待对象失败","error",MB_ICONERROR);CloseHandle(hpipe);CloseHandle(hevent);hpipe=NULL;return 0;}CloseHandle(hevent);MessageBox(NULL,"创建完成","ok",MB_ICONINFORMATION);flag=1;return 1;}CString guandao::read(){char s[200];DWORD d;if(!ReadFile(hpipe,s,200,&d,NULL)){MessageBox(NULL,"读取数据失败","error",MB_ICONERROR);return "";}return s;}int guandao::write(CString content){DWORD d;if(!WriteFile(hpipe,content,content.GetLength()+1,&d,NULL)){MessageBox(NULL,"写入数据失败","error",MB_ICONERROR);return 0;}return 1;}int guandao::connect(CString sever,CString name ){if(flag){MessageBox(NULL,"已创建管道","error",MB_ICONERROR);return 0;}CString nn="\\\\"+sever+"\\pipe\\"+name;if(!WaitNamedPipe(nn,500)){MessageBox(NULL,"无可用管道","error",MB_ICONERROR);return 0;}hpipe=CreateFile(nn,GENERIC_ALL,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(hpipe==INVALID_HANDLE_VALUE){MessageBox(NULL,"链接命名管道"+name+"失败","error",MB_ICONERROR);hpipe=NULL;return 0;}//MessageBox(NULL,"链接完成","ok",MB_ICONINFORMATION);return 1;}