欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-02 22:57:40
...

邮槽

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

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

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

邮槽的名称:

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

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

思路解析:

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

案例效果如图:

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


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

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

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

  1. 为按钮关联一个变量:
    (六)Win32进程通信 —— 邮槽的使用
  2. 双击接收按钮,为服务端实现接收数据的功能:

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

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:

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

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

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

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