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

来源:互联网 发布:手机淘宝家乡版在哪里 编辑:程序博客网 时间:2024/05/17 16:44

油槽是

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 hereHANDLE hMailslot; //创建一个油槽句柄hMailslot = CreateMailslot("\\\\.\\mailslot\\MyMailslot",0,MAILSLOT_WAIT_FOREVER,NULL);//创建油槽,具体用法参见MSDNif(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来实现将会相当复杂。

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

 

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

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

原创粉丝点击