進程通信係列-命名管道
命名管道作為一種通信方法,有其獨特的優越性,這主要表現在它不完全依賴於某一種協議,而是適用於任何協議——隻要能夠實現通信。命名管道具有很好的使用靈活性,表現在:
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;
}
最後更新:2017-04-03 20:19:50