命名管道作为一种通信方法,有其独特的优越性,这主要表现在它不完全依赖于某一种协议,而是适用于任何协议——只要能够实现通信。 命名管道具有很好的使用灵活性,表现在: 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;
}