在Windows环境下,实现进程间通信的方式有很多种,如套接字、管道、远程过程调用和NETBIOS等,邮槽是其中实现单通道进程间通信的一种。创建邮槽的进程被称为邮槽服务器,而其它发送消息给邮槽的进程被称为邮槽客户端。邮槽客户端能发送消息给本机的邮槽,也可发送消息给局域网内其他计算机内的邮槽,所有这些消息都存储在邮槽内,直到邮槽服务器读取它。这些消息通常是以广播的方式发送,建立在面向无链接的数据报的基础上,因此在线路不好时传输质量不可靠。
这种进程间通信的方式比较适用于在局域网环境内传送和接收短消息,也可在局域网内向所有计算机广播消息。
用邮槽进行进程间通信主要通过三个步骤来实现:创建邮槽服务器,向邮槽发送消息和从邮槽中读取消息。下面笔者将用Windows的API函数来完成这三个步骤。
一、创建邮槽服务器
以下代码用于创建一个名叫sample_mailslot的邮槽:
BOOL FAR PASCAL Makeslot( )
{
// 邮槽名称都定义在//./mailslot/目录下
LPSTR lpszSlotName = "////.//mailslot//sample_mailslot";
// 邮槽句柄"hSlot1" 是一个全局变量
hSlot1 = CreateMailslot(lpszSlotName,0,
// 对接受的消息没有最大值限制
MAILSLOT_WAIT_FOREVER, // 没有最大读延迟时间
(LPSECURITY_ATTRIBUTES) NULL); // 无安全属性
if (hSlot1 == INVALID_HANDLE_VALUE)
//创建邮槽失败
return FALSE;
return TRUE;
}
二、客户端与邮槽服务器通信
客户端通过API函数向邮槽发送消息,然后消息被广播到域内的每一台计算机上,但只有指定的邮槽接收这些消息。在这里要注意被广播的消息每条不能超过400个字节,但对每个邮槽能接受的消息的数量没有限制。
BOOL FAR PASCAL Writeslot( ) {
BOOL fResult;
HANDLE hFile;
DWORD cbWritten;
LPSTR lpszMessage = "Message for sample_mailslot in primary domain";
hFile = CreateFile("////*//mailslot//sample_mailslot",
GENERIC_WRITE,
FILE_SHARE_READ,
(LPSECURITY_ATTRIBUTES) NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);
if (hFile == INVALID_HANDLE_VALUE)
// 创建客户端邮槽句柄失败
return FALSE;
fResult = WriteFile(hFile, lpszMessage,
(DWORD) lstrlen(lpszMessage) + 1,
&&cbWritten,
(LPOVERLAPPED) NULL);
if (!fResult)
// 发送消息错误
return FALSE;
fResult = CloseHandle(hFile);
return TRUE;
}
三、从邮槽中读取数据
邮槽服务器通过GetMailslotInfo函数判断邮槽中是否有数据,如果有,则通过ReadFile函数从邮槽中读取。下面的代码完成从邮槽中读取一条消息。
BOOL FAR PASCAL Readslot()
{
DWORD cbMessage, cMessage, cbRead;
BOOL fResult;
LPSTR lpszBuffer;
cbMessage = cMessage = cbRead = 0;
//邮槽句柄hSlot1是一个全局变量
fResult = GetMailslotInfo(hSlot1,
// 邮槽句柄
(LPDWORD) NULL, // 对消息的大小没有最大限制
&&cbMessage, // 下一条消息的大小
&&cMessage, // 消息的数量 (LPDWORD) NULL); if(cbMessage == MAILSLOT_NO_MESSAGE)
// 邮槽内无消息
{ printf( "No waiting messages.");
return TRUE; }
// 为消息分配内存
lpszBuffer = (LPSTR) GlobalAlloc(GPTR, cbMessage);
lpszBuffer[0] = '/0'; fResult = ReadFile(hSlot1, lpszBuffer, cbMessage, &&cbRead,
(LPOVERLAPPED) NULL);
// 显示消息
Printf("%s",lpszBuffer);
GlobalFree((HGLOBAL) lpszBuffer);
return TRUE; }
分享到:
相关推荐
进程间通信,进程间通信,邮槽进程间通信,进程间通信,邮槽进程间通信,进程间通信,邮槽
用邮槽实现在windows下的进程间通信
进程间通信的VC++源码实例集,进程之间的通信以及实现方法实例,通过一些小程序来实现,这些小程序有剪贴板实例、邮槽、匿名管道等,希望对VC++基础用户有帮助。
本实例利用邮槽技术实现两个进程间的通信,包括发送数据和接收数据。
运用邮槽进行进程间的通信,也是进程间通信的方法之一。
通过mailsolt来实现进程间通信,使用方法: 两个exe,一个服务端一个客户端,打开服务端创建邮槽 再打开客户端输入要发送的信息点击发送 回到服务端点击接受,注意每次发送信息前都需要创建邮槽。
进程间通信的VC++源码实例集,邮槽、匿名管道等。
进程间通过邮槽通信实例,平台VS2010。这只是一个简单实例,供大家学习参考用。本人也只是菜鸟一个。
VC++ 四种进程间通信的完整实例,一般来说,进程通信采取四种形式:剪贴板、匿名管道、命名管道、邮槽。孙鑫将带你用实例来验证这四种方式的优略性,进而帮助VC编程者熟悉掌握进程间通信的方方面面,并附有孙鑫老师...
c++ 进程间通信 四种方式:剪贴板 匿名管道 命名管道 邮槽
Windows 的IPC(进程间通信)机制主要是异步管道和命名管道。(至于其他的IPC方式,例如内存映射、邮槽等这里就不介绍了) 管道(pipe)是用于进程间通信的共享内存区域。创建管道的进程称为管道服务器,而连接到这...
vc 实现了4种进程间的通信,包括剪贴板 命名管道 匿名管道 邮槽
作用:通过邮槽实现跨网络进程间的一对多的单向通讯
4.3.1 用邮槽进行进程间通信的步骤 85 4.3.2 邮槽服务器端与客户端之间通信的实例 86 4.4 如何用Windows套接字进行进程间通信 90 4.4.1 套接字分类 90 4.4.2 流式套接字编程流程 91 4.4.3 套接字调用基本函数 ...
详细讲解进程间通讯的四种方式:剪贴板、匿名管道、命名管道和邮槽。并比较分析这几种进程间通信的优点和缺点。
自己编网络聊天程序,运用了Socket和进程通信,仅供参考 压缩包里包含了:源码+可执行程序。
进程间通讯(即:同机通讯)和数据交换有多种方式:消息、共享内存、匿名(命名)管道、邮槽、Windows套接字等多种技术。“共享内存”(shared memory)可以定义为对一个以上的进程是可见的内存或存在于多个进程的虚拟...
这是一个多进程通信的程序,有一个主进程和各种类型的子进程进行通信。
第5章 进程间通信 ... 5.4 使用邮槽实现进程间通信 5.5 使用剪贴板实现共享 5.6 使用管道实现进程间通信 5.7 驱动程序和Win32应用程序之间的数据通信 5.8 小结 5.9 思考题 5.10 练习题