(六)Win32进程通信 —— 邮槽的使用

邮槽

邮槽是Windows操作系统提供的一种单向进程间通信机制,可用于单机或者网络上的多机分布式环境。对于相对简短的低频率信息发送,使用邮槽通常比命名管道或者Unix域套接字更简单。

从中我们可以读出三个简单的信息:

  • 邮槽传输数据是单向的(客户端 --> 服务端
  • 可以在进程间通信,也可以在网络间通信
  • 每次传输的数据比较小(400B

邮槽的名称:

  • \\\\.\\mailslot\\[path\\]name–> 本机
  • \\\\DomainName\\[path\\]name–> 网络域名
  • \\\\ComputerName\\[path\\]name–> 网络计算机名
  • \\\\*\\mailslot\\[path\\]name --> 广播

此案例将利用邮槽来实现两个进程间的通信,选择第一个名称

思路解析:

  • 服务端创建邮槽,等待数据到来并读取
  • 客户端打开邮槽,写入数据

案例效果如图:

在这里插入图片描述


服务端窗口及功能实现步骤:

  1. 窗口搭建及自定义ID名称:

在这里插入图片描述

  1. 为按钮关联一个变量:
    在这里插入图片描述
  2. 双击接收按钮,为服务端实现接收数据的功能:

在这里插入图片描述

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("接收"));

客户端窗口及功能实现步骤:

  1. 界面搭建及自定义控件ID:

在这里插入图片描述

  1. 双击发送按钮,为客户端实现发送数据的功能:

在这里插入图片描述

// 打开邮槽(邮槽的本质是一个文件)  参数含义见代码下面
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

情人节快乐,各位

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值