[进程间通信]利用油槽来实现进程间的通信

油槽是

1:基于广播通信设计出来的

2:它采用无连接的不可靠的数据传输

3:是一种单向的通信方式

4:油槽的服务器进程读取数据,客户端进程写入数据

5:消息的长度在424字节以下(大约210个汉字)

 

实现步骤:

1:建立一个MFC AppWizard,名为MailslotSrv的单文档程序,添加一个菜单项,名为“接收数据”,IDM_MAILSLOT_RECE,在view内下为该菜单添加命令响应

2:在响应函数内编写以下代码,

void CMailslotSrvView::OnReceive() 
{
	// TODO: Add your command handler code here
	HANDLE hMailslot; //创建一个油槽句柄
	hMailslot = CreateMailslot("\\\\.\\mailslot\\MyMailslot",
		0,MAILSLOT_WAIT_FOREVER,NULL);//创建油槽,具体用法参见MSDN
	if(INVALID_HANDLE_VALUE == hMailslot) //如果创建油槽失败,提示用户
	{
		MessageBox("创建邮槽失败");
		return;
	}
	char buf[100];//读取数据
	DWORD dwRead;
	if(!ReadFile(hMailslot,buf,100,&dwRead,NULL))
	{
		MessageBox("读取数据失败");
		CloseHandle(hMailslot);//关闭油槽的句柄
		hMailslot = NULL;
		return;
	}
	MessageBox(buf);
	CloseHandle(hMailslot);//读取数据成功与失败都要关闭油槽句柄,避免析构时再次调用到。

	
}

3:添加一个MFC AppWizard新工程,名为MailslotClt,与MailslotSrv在同一文件目录下(平行目录),同样添加一个菜单,名为“发送数据”,添加命令响应。

4:在命令响应函数内添加以下代码,

void CMailslotCltView::OnSend() 
{
	// TODO: Add your command handler code here
	//基于广播通信
	HANDLE hMailslot;
	hMailslot = CreateFile("\\\\.\\mailslot\\MyMailslot",GENERIC_WRITE,
		FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);//只能发送数据
	if(INVALID_HANDLE_VALUE == hMailslot)
	{
		MessageBox("打开邮槽失败");
		return;
	}
	char buf[] = "Hello,Mailslot";
	DWORD dwWrite;
	if(!WriteFile(hMailslot,buf,strlen(buf) + 1,&dwWrite,NULL))
	{
		MessageBox("写入数据失败");
		CloseHandle(hMailslot);
		return;
	}
	CloseHandle(hMailslot);
	
}


5:分别编译后运行即可。

注意:先在服务器端上单击“接收数据”,然后在客户端单击“发送数据”。顺序颠倒的话程序无法正常运行,因为油槽没有创建就不必谈通信了。

 

这是两个进程之间进行的通信(单向)

 

 

同一个进程中如何实现读写数据?

很简单,在一个程序中同时编写油槽的服务器端和客户端,用服务器端接收数据,用客户端发送数据。

 

我们可以利用油槽的广播特性来制作一个会议通知系统,相比之下其程序代码量会非常少。若是同样的系统用socket来实现将会相当复杂。

在所有员工的电脑上安装一个油槽服务器程序,在管理人员电脑上安装一个油槽客户端程序即可实现会议通知。如果要发布一个开会信息,只需要在客户程序中发送出这个信息,那么所有员工将会同时接收到这个通知信息。这样就形成了一个简单的一对多单向通信。

 

油槽和命名管道一样,不仅可以台主机上完成进程间的通信,而且可以进行跨网络的通信。对于剪贴板和匿名管道来说,它们只能实现在同一台机器上进程间的通信。

油槽可以实现一对多通信,但是传输的数据量非常小。若要传输大量数据可以采用管道方式来完成。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值