油槽是windows系统中最简单的一种进程间通讯的方式,一个进程可以创建一个油槽,其他进程可以通过打开此油槽与创建油槽的进程通讯;油槽的通讯时单向的,只有服务端才能从油槽中读取消息,客户端只能写入消息,消息被写入后以队列的方式保存(先进后出);油槽除了可以在本机内进行通讯外,还可以在主机间进程通讯(使用UDP协议),想要通过网络进行油槽通讯,必须要知道服务端的主机名或域名。
油槽客户端:
#include "stdafx.h"
#include "windows.h"
int _tmain(int argc, _TCHAR* argv[])
{
// 1. 打开邮槽对象
HANDLE hFile = CreateFile(
L"\\\\.\\mailslot\\Sample", // 邮槽名称
GENERIC_WRITE, // 读写属性
FILE_SHARE_READ, // 共享属性
NULL, // 安全属性
OPEN_EXISTING, // 打开方式
FILE_ATTRIBUTE_NORMAL, // 标志位
NULL); // 文件模板(默认留空)
// 2. 向mailslot写入
DWORD dwWritten;
LPSTR lpMessage = "邮槽测试消息!";
DWORD dwMegLen = strlen(lpMessage) + sizeof(CHAR);
WriteFile(hFile, lpMessage, dwMegLen, &dwWritten, NULL);
// 3. 结束
printf("已经向邮槽写入信息!\n");
CloseHandle(hFile);
return 0;
}
油槽服务端:
#include "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
// 1. 创建邮槽对象
HANDLE hSlot = CreateMailslot(
L"\\\\.\\mailslot\\Sample", // 邮槽名
0, // 不限制消息大小
MAILSLOT_WAIT_FOREVER, // 无超时
(LPSECURITY_ATTRIBUTES)NULL); // 安全属性
// 2. 循环读取邮槽信息
while (true) {
// 2.1 获取邮槽消息数量
DWORD dwMsgCount = 0, dwMsgSize = 0;
GetMailslotInfo( /* 获取邮槽信息 */
hSlot, // 邮槽句柄
(LPDWORD)NULL, // 无最大消息限制
&dwMsgSize, // 下一条消息的大小
&dwMsgCount, // 消息的数量
(LPDWORD)NULL); // 无时限
if (dwMsgSize == MAILSLOT_NO_MESSAGE) {
Sleep(2000);
continue;
}
// 2.2 循环获取全部消息(有可能不只一条)
while (dwMsgCount)
{
PBYTE lpBuffer;
lpBuffer = new BYTE[dwMsgSize + 0x10];
// 读取邮槽中的信息
DWORD dwRet;
ZeroMemory(lpBuffer, dwMsgSize);
if (!ReadFile(hSlot, lpBuffer, dwMsgSize, &dwRet, NULL))
{
printf("ReadFile函数执行失败,错误码:%d.\n", GetLastError());
delete[] lpBuffer;
return 0;
}
// 显示信息
printf("邮槽的内容: %s\n", lpBuffer);
// 计算剩余的消息数
GetMailslotInfo(hSlot, (LPDWORD)NULL, &dwMsgSize, &dwMsgCount, nullptr);
delete[] lpBuffer;
}
}
return 0;
}