Socket相似支持网络之间不同进程的通信

MFC---进程间的通信方式(命名管道)_命令处理程序

客户端

void CChildView::OnCreateNamedPipe()
{
	// TODO: 在此添加命令处理程序代码
	//1 创建一个命名管道
	LPCTSTR szPipeName=TEXT("\\\\.\\pipe\\mypipe");
	hNamedPipe=CreateNamedPipe(szPipeName,PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,
		PIPE_TYPE_BYTE,1,1012,1024,0,NULL);
	if(hNamedPipe ==INVALID_HANDLE_VALUE){
		printf("CreateNamedPipe failed with %d\n",GetLastError());
		MessageBox(_T("创建命名管道失败"));
		return;
	}
	//2 等待客户端的连接
	HANDLE hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
	if(NULL==hEvent){
		MessageBox(_T("创建事件失败"));
		CloseHandle(hNamedPipe);
		hNamedPipe=NULL;
		return;
	}
	OVERLAPPED ovlap;
	ZeroMemory(&ovlap,sizeof(OVERLAPPED));
	ovlap.hEvent=hEvent;
	//等待连接
	if(!ConnectNamedPipe(hNamedPipe,&ovlap)){
		if(ERROR_IO_PENDING!=GetLastError()){
			MessageBox(_T("等待客户端连接失败"));
			CloseHandle(hNamedPipe);
			CloseHandle(hEvent);
			hNamedPipe=NULL;
			hEvent=NULL;
			return;
		} 
	}
	if(WaitForSingleObject(hEvent,INFINITE)==WAIT_FAILED){

		if(ERROR_IO_PENDING!=GetLastError()){
			MessageBox(_T("等待对象失败"));
			CloseHandle(hNamedPipe);
			CloseHandle(hEvent);
			hNamedPipe=NULL;
			hEvent=NULL;
			return;
		}

	}
}

void CChildView::OnSreadNamedPipe()
{
	// TODO: 在此添加命令处理程序代码
	char szBuf[100]={0};
	DWORD dwRead;
	if(!ReadFile(hNamedPipe,szBuf,100,&dwRead,NULL))
	{

		MessageBox(_T("读取数据失败"));
		return;
	}
	MessageBox((CStringW)szBuf);
}

void CChildView::OnSwriteNamedPipe()
{
	// TODO: 在此添加命令处理程序代码
	//写入数据
	char szBuf[100]="OnNamedPipe Server";
	DWORD dwWrite;
	if(!WriteFile(hNamedPipe,szBuf,strlen(szBuf+1),&dwWrite,NULL))
	{

		MessageBox(_T("写入数据失败"));
		return;
	}
	MessageBox(_T("写入数据成功"));
}

服务端

void CChildView::OnConnectNameedPipe()
{
	// TODO: 在此添加命令处理程序代码
	//创建一个文件句柄
	LPCTSTR szNamedPipe=TEXT("\\\\.\\pipe\\mypipe");
	if(0==WaitNamedPipe(szNamedPipe,NMPWAIT_WAIT_FOREVER)){
		MessageBox(_T("当前没有可以利用的管道"));
		return;
	}

	hNamedPipe=CreateFile(szNamedPipe,GENERIC_READ|GENERIC_WRITE,
		0,NULL,OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,NULL);
	if(hNamedPipe==INVALID_HANDLE_VALUE){
		printf("CreateMailslot failed with %d\n",GetLastError());
		MessageBox(_T("打开命名管道失败!"));
		hNamedPipe=NULL;
		return;
	}
}

void CChildView::OnReadNameedPipe()
{
	// TODO: 在此添加命令处理程序代码
	char szBuf[100]={0};
	DWORD dwRead;
	if(!ReadFile(hNamedPipe,szBuf,100,&dwRead,NULL))
	{

		MessageBox(_T("读取数据失败"));
		return;
	}
	MessageBox((CStringW)szBuf);
}

void CChildView::OnWriteNameedPipe()
{
	// TODO: 在此添加命令处理程序代码
	//写入数据
	char szBuf[100]="NAMEDPIPE CLIENT";
	DWORD dwWrite;
	if(!WriteFile(hNamedPipe,szBuf,strlen(szBuf+1),&dwWrite,NULL))
	{

		MessageBox(_T("写入数据失败"));
		return;
	}
	MessageBox(_T("写入数据成功"));
}