简介

使用邮槽通信的进程分为服务端和客户端。邮槽由服务端创建,在创建时需要指定邮
槽名,创建后服务端得到邮槽的句柄。在邮槽创建后,客户端可以通过邮槽名打开邮槽,
在获得句柄后可以向邮槽写入消息。

邮槽通信是单向的,只有服务端才能从邮槽中读取消息,客户端只能写入消息。消息
是先入先出的。客户端先写入的消息在服务端先被读取

通过邮槽通信的数据可以是任意格式的,但是一 条消息不能大于424字节。

邮槽除了在本机内进行进程间通信外,在主机间也可以通信。但是在主机间进行邮槽通
信,数据通过网络传播时使用的是数据报协议(UDP),所以是一种不可靠的通信。通过网
络进行邮槽通信时,客户端必须知道服务端的主机名或域名。

代码示例

发送端

void CChildView::OnSend()
{
	// TODO: 在此添加命令处理程序代码
	//创建一个文件句柄
	LPCTSTR szSlotName=TEXT("\\\\.\\mailslot\\Mymailslot");
	HANDLE hMailSlot=CreateFile(szSlotName,FILE_GENERIC_WRITE,
		FILE_SHARE_READ,NULL,OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,NULL);
	if(hMailSlot==INVALID_HANDLE_VALUE){
		printf("CreateMailslot failed with %d\n",GetLastError());
		return;
	}
	//写入数据
	char szBuf[100]="Bingo is han";
	DWORD dwWrite;
	if(!WriteFile(hMailSlot,szBuf,strlen(szBuf+1),&dwWrite,NULL))
	{

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

}

接收端

void CChildView::OnSlot()
{
	// TODO: 在此添加命令处理程序代码
	//  “\\\\.\\mailslot\\Mymailslot    \\.\mailslot\Mymailslot
	//1 创建一个邮槽
	LPCTSTR szSlotName=TEXT("\\\\.\\mailslot\\Mymailslot");
	HANDLE hSlot=CreateMailslot(szSlotName,
		0,//no maximum message size
		MAILSLOT_WAIT_FOREVER,//no time-out for operations
		NULL
		);//default security

	if(hSlot==INVALID_HANDLE_VALUE){
		printf("CreateMailslot failed with %d\n",GetLastError());
		return;
	}
	//2 读取数据
	char szBuf[100]={0};
	DWORD dwRead;
	if(!ReadFile(hSlot,szBuf,100,&dwRead,NULL))
	{

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


}

效果展示

MFC---进程间的通信方式(邮槽)_c++