邮槽(MailSlot)是 Windows 系统中最简单的一种进程间通信方式,一个进程可以创建一个邮槽,其它进程可以通过打开此邮槽与创建邮槽的进程通讯。<br />邮槽的通讯是单向的,只有服务端才能从邮槽中读取消息,客户端只能写入消息,消息被写入邮槽后以队列的方式保存(先入先出)。<br />邮槽除了可以在本机内进行进程间通讯外,还可以在主机间进行通讯(使用 UDP 协议),想要通过网络进行邮槽通讯,必须要知道服务端的主机名或域名。
需要用到的函数
API | 说明 |
---|---|
CreateMailslot | 创建一个邮槽 |
GetMailslotInfo | 获取邮槽信息 |
CreateFile | 打开文件(打开邮槽) |
WriteFile | 写入文件(向邮槽写入数据) |
ReadFile | 读取文件(在邮槽中读取数据) |
邮槽通信-接收端
#include <iostream>
#include <windows.h>
int main()
{
// 1. 创建一个邮槽内核对象,用于进行消息的接收,由发送端向其中写入内容
HANDLE MailSlot = CreateMailslot(
L"\\\\.\\mailslot\\my_mailslot", // 符合邮槽命名规范的名字
0, // 消息的最大长度,如果是 0 表示不限制
MAILSLOT_WAIT_FOREVER, // 等待接收消息的时长,这里是一直等
NULL); // 安全属性
// 2. 提供几个变量,用于接收消息的数量和消息的长度
DWORD MessageCount = 0, MessageLength = 0;
// 3. 编写死循环,不断的尝试从邮槽对象中读取内容
while (TRUE)
{
GetMailslotInfo(
MailSlot, // 邮槽对象的句柄
NULL, // 当前允许接收的最大消息数量
&MessageLength, // 下一条消息的长度
&MessageCount, // 邮槽中还有多少条消息
NULL); // 表示不等待(无时限)
// 如果返回给我们的消息长度是 -1,就表示目前没有消息,稍后再看
if (MessageLength == MAILSLOT_NO_MESSAGE)
{
Sleep(500);
continue;
}
// 如果有内容,根据消息的实际长度,动态的分配一块堆空间并用 ReadFile 从邮槽内读取到内容
DWORD ReadBytes = 0;
CHAR* Buffer = new CHAR[MessageLength]{};
ReadFile(MailSlot, Buffer, MessageLength, &ReadBytes, NULL);
// 显示读取到的内容
printf("recv: %s\n", Buffer);
delete[] Buffer;
}
return 0;
}
邮槽通信-发送端
#include <windows.h>
int main()
{
// 使用 CreateFile 打开邮槽,当前必须保证邮槽已经创建了,否则后面的操作没有意义
HANDLE MailSlot = CreateFileA("\\\\.\\mailslot\\my_mailslot", GENERIC_WRITE,
FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// 通过 WriteFile 向邮槽内发送数据
DWORD WriteBytes = 0;
WriteFile(MailSlot, "hello world", 12, &WriteBytes, NULL);
return 0;
}