(六)Win32进程通信 —— 邮槽的使用
程序员文章站
2022-04-02 22:57:40
...
邮槽
邮槽是Windows操作系统提供的一种
单向进程间通信机制
,可用于单机
或者网络
上的多机分布式环境。对于相对简短的低频率信息
发送,使用邮槽通常比命名管道或者Unix域套接字更简单。
从中我们可以读出三个简单的信息:
- 邮槽传输数据是单向的(
客户端 --> 服务端
) - 可以在进程间通信,也可以在网络间通信
- 每次传输的数据比较小(
400B
)
邮槽的名称:
\\\\.\\mailslot\\[path\\]name
–> 本机\\\\DomainName\\[path\\]name
–> 网络域名\\\\ComputerName\\[path\\]name
–> 网络计算机名\\\\*\\mailslot\\[path\\]name
--> 广播此案例将利用邮槽来实现两个进程间的通信,选择第一个名称
思路解析:
- 服务端创建邮槽,等待数据到来并读取
- 客户端打开邮槽,写入数据
案例效果如图:
服务端窗口及功能实现步骤:
- 窗口搭建及自定义ID名称:
- 为按钮关联一个变量:
- 双击接收按钮,为服务端实现接收数据的功能:
m_b.EnableWindow(0); // 将按钮变成无法选中状态
m_b.SetWindowText(_T("正在读取中...")); // 设置按钮的内容
// 创建邮槽 // == /
HANDLE hmailslot = CreateMailslot(_T("\\\\.\\mailslot\\MyMailslot"),
0, MAILSLOT_WAIT_FOREVER, NULL); // 创建邮槽一直等待数据到来
if(hmailslot == INVALID_HANDLE_VALUE) // 判断是否成功创建邮槽
{
m_b.EnableWindow(1); // 将按钮变回来(可以选中)
m_b.SetWindowText(_T("接收")); // 内容也变回来
AfxMessageBox(_T("CreateMailslot error"));
return;
}
TCHAR buf[400]; // 用于接收从邮槽中获取的数据,最大只能是 400
ZeroMemory(buf, 400); // 清0
DWORD dwRead; // 实际读取的数据个数
// 和文件方式相同,读取邮槽中的内容
if(!ReadFile(hmailslot, buf, 400, &dwRead, NULL))
{
m_b.EnablWindow(1); // 读取失败,则按钮还原
m_b.SetWindowText(_T("接收"));
AfxMessageBox(_T("ReadFile error"));
CloseHandle(hmailslot); // 读取文件失败,则关闭邮槽的句柄
return;
}
SetDlgItemText(IDC_EDIT_DATA, buf); // 将读取到内容放到编辑框中
CloseHandle(hmailslot);
m_b.EnableWindow(1); // 按钮还原
m_b.SetWindowText(_T("接收"));
客户端窗口及功能实现步骤:
- 界面搭建及自定义控件ID:
- 双击发送按钮,为客户端实现发送数据的功能:
// 打开邮槽(邮槽的本质是一个文件) 参数含义见代码下面
HANDLE hMailslot = CreateFile(_T("\\\\.\\mailslot\\MyMailslot"),
GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NPRMAL, NULL);
if(hMailslot == INVALID_HANDLE_VALUE) // 判断打开邮槽失败
{
AfxMessageBox(_T("Open mailslot failed."));
return 0;
}
TCHAR buf[400]; // 存储数据的缓冲区,最大只能是400
ZeroMemory(buf, 400); // 清0
GetDlgItemText(IDC_EDIT_DATA, buf, 400); // 获取控件中的数据
DWORD dwWrite; // 实际写入的数据个数
if(!WriteFile(hMailslot, buf, 400, &dwWrite, NULL))
{
CloseHandle(hMailslot); // 写入数据失败,关闭句柄
AfxMessageBox(_T("发送数据失败!"));
return;
}
CloseHandle(hMailslot); // 关闭句柄
CreateFile各个参数的含义在(二)Win32进程通信 —— 内存映射文件 中提到过
作者:浪子花梦
Time:2020.02.14
情人节快乐,各位
上一篇: WIN32滚动条的创建和使用
下一篇: (五)Win32进程通信 —— 匿名管道