油槽是
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来实现将会相当复杂。
在所有员工的电脑上安装一个油槽服务器程序,在管理人员电脑上安装一个油槽客户端程序即可实现会议通知。如果要发布一个开会信息,只需要在客户程序中发送出这个信息,那么所有员工将会同时接收到这个通知信息。这样就形成了一个简单的一对多单向通信。
油槽和命名管道一样,不仅可以台主机上完成进程间的通信,而且可以进行跨网络的通信。对于剪贴板和匿名管道来说,它们只能实现在同一台机器上进程间的通信。
油槽可以实现一对多通信,但是传输的数据量非常小。若要传输大量数据可以采用管道方式来完成。