閱讀679 返回首頁    go 阿裏雲 go 技術社區[雲棲]


進程通信係列-命名管道

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

  上一篇:go 【轉】File Mapping技術
  下一篇:go AMD曬“無字天書”