进程的通信 - 邮槽

news2024/11/15 1:31:46

邮槽

邮槽是Windows系统提供的一种单向进程间的通信机制。对于相对简短的地坪率信息发送,使用邮槽通常比命名管道或者Unix域套接字更简单    

    使用邮槽通信的进程分为服务端和客户端。邮槽由服务端创建,在创建时需要指定邮槽名,创建后服务端得到邮槽的句柄。在邮槽创建后,客户端可以通过邮槽名打开邮槽,在获得句柄后可以向邮槽写入消息。

    邮箱槽通信时单向的,只有服务端才能从邮箱槽中读取消息,客户端只能写入消息。消息先入先出。客户端先写入的消息在服务端先被读取。

    通过邮槽通信的数据可以是任意格式的,但是一条消息不能大于424字节

    邮槽除了在本机内进行进程间的通信外,在主机间也可以通信。但是在主机间进行邮槽通信,数据通过网络传播时使用的是数据协议(UDP),所以是一种不可靠的通信。通过网络进行邮槽通信时,客户端必须知道服务端的主机名或域名。

过程

1.服务端通过CreateMailslot创建一个邮槽

2.客户端通过CreateFile与邮槽连接

3.客户端通过WritrFile写入数据

4.服务端通过ReadFile读数据

邮槽通信常用的API接口

CreateMailslot函数

HANDLE CreateMailslot(
  [in]           LPCWSTR               lpName,
  [in]           DWORD                 nMaxMessageSize,
  [in]           DWORD                 lReadTimeout,
  [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
  • 参数lpName

指定邮槽的名称

邮槽的名称:

  • \\\\.\\mailslot\\[path\\]name–> 本机

  • \\\\DomainName\\[path\\]name–> 网络域名

  • \\\\ComputerName\\[path\\]name–> 网络计算机名

  • \\\\*\\mailslot\\[path\\]name –> 广播

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

  • 参数nMaxMessageSize 

可以写入邮槽的单个消息的最大大小(字节,0表示可以是任意大小

  • 参数IReadTimeout

可以等待消息写入邮槽的事件,0表示没有消息立即返回;MAILSLOT_WAIT_FOREVER表示永远等待

函数成功返回邮件槽的句柄,失败则返回INVALID_HANDLE_VALUE。

CreateMailslotW function (winbase.h) - Win32 apps |微软学习 (microsoft.com)

ReadFile函数

BOOL ReadFile(
  [in]                HANDLE       hFile,
  [out]               LPVOID       lpBuffer,
  [in]                DWORD        nNumberOfBytesToRead,
  [out, optional]     LPDWORD      lpNumberOfBytesRead,
  [in, out, optional] LPOVERLAPPED lpOverlapped
);
  • 参数hFile

设备句柄

  • 参数lpBuffer

 接收数据缓冲区的指针

  • 参数nNumberOfBytesToRead

读取的最大字节数

  • 参数lpNumberOfBytesRead

指向变量的指针,用来接收使用同步hFile参数读取的字节数。

  • 参数lpOverlapped 

重叠结构的指针,使用FILE_OVERLAPPED打开hFile参数,则为必须,否则可为NNULL

ReadFile function (fileapi.h) - Win32 apps |微软学习 (microsoft.com)

CreateFile 

HANDLE CreateFile(
  [in]           LPCWSTR               lpFileName,
  [in]           DWORD                 dwDesiredAccess,
  [in]           DWORD                 dwShareMode,
  [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  [in]           DWORD                 dwCreationDisposition,
  [in]           DWORD                 dwFlagsAndAttributes,
  [in, optional] HANDLE                hTemplateFile
);
  • 参数lpFileName

要创建或打开的文件或设备的名称。这里填入邮槽名

  • 参数dwDesiredAccess

对文件或设备的访问方式,可以分为读、写、两者或两者都不是

  • 参数dwShareMode

请求共享模式,可以读取、写入、两者、删除、所有这些或 无。

取值含义

0

0x00000000

防止其他进程在请求删除、读取或写入访问权限时打开文件或设备。

FILE_SHARE_DELETE

0x00000004

对文件或设备启用后续打开操作以请求删除访问权限。

否则,如果其他进程请求删除访问权限,则无法打开文件或设备。

如果未指定此标志,但已打开文件或设备以进行删除访问,则函数 失败。

注意删除访问权限允许删除和重命名操作。

FILE_SHARE_READ

0x00000001

启用对文件或设备的后续打开操作以请求读取访问权限。

否则,如果其他进程请求读取访问权限,则无法打开文件或设备。

如果未指定此标志,但文件或设备已打开以进行读取访问,则函数 失败。

FILE_SHARE_WRITE

0x00000002

允许对文件或设备执行后续打开操作以请求写入访问权限。

否则,如果其他进程请求写入访问权限,则无法打开文件或设备。

如果未指定此标志,但文件或设备已打开以进行写入访问或具有文件映射 使用写入访问权限时,函数将失败。

  • 参数lpSecurityAttributes

 安全描述符,为NULL表示任何子进程都不能继承CreateFile返回的句柄。

  • 参数dwCreationnDisposition

对存在或不存在的文件或设备执行的操作。

对于文件以外的设备,此参数通常设置为OPEN_EXISTING

  • 参数dwFlagAndAttrubutes

文件或设备属性和标志,FILE_ATTRIBUTE_NORMAL是最多的 文件的通用默认值。

  • 参数hTemplateFile

此参数可以为NULL。

CreateFileW 函数 (fileapi.h) - Win32 apps |微软学习 (microsoft.com)

BOOL WriteFile(
  [in]                HANDLE       hFile,
  [in]                LPCVOID      lpBuffer,
  [in]                DWORD        nNumberOfBytesToWrite,
  [out, optional]     LPDWORD      lpNumberOfBytesWritten,
  [in, out, optional] LPOVERLAPPED lpOverlapped
);
  •  参数hFile

文件或设备句柄

  • 参数lpBuffer

写入数据的缓冲区指针

  • 参数nNumberOfBytesToWrote

写入文件或设备的字节数

  • 参数lpNumberOfBytesWritten

指向变量的指针,该变量接收使用同步hFile参数时写入的字节数。

  • 参数lpOverlapped

指向重叠结构的指针是 如果使用FILE_FLAG_OVERLAPPED 打开hFile参数,则为必需,否则此参数可以为NULL。

如果函数成功,则返回值为非零值 (TRUE),如果函数失败或异步完成,则返回值为零(FALSE)。

WriteFile function (fileapi.h) - Win32 apps |微软学习 (microsoft.com)

Demo示例

两个基于单个对话框的MFC应用

在菜单栏中点击“服务端”,响应函数创建一个邮槽,然后开始永远等待消息的到来,将接收到的消息通过提示框显示出来

在菜单栏中点击“发送数据”,响应函数会与邮槽连接,并向邮槽写入数据

服务端 

void CChildView::OnSlot()
{
	//邮槽名 "\\.\mailslot\Mymailslot"
	//1.创建一个邮槽
	LPCTSTR szSlotName = TEXT("\\\\.\\mailslot\\Mymailslot");
	HANDLE hSlot;
	hSlot = CreateMailslot(szSlotName,
		0,	//最大消息大小的限制
		MAILSLOT_WAIT_FOREVER, //无超时操作
		(LPSECURITY_ATTRIBUTES)NULL	//默认安全
	);
	//判断创建的邮槽是否有效
	if (hSlot == INVALID_HANDLE_VALUE) {
		//如果创建的邮槽是一个无效的句柄
		TRACE("CreateMailslot failed with %d\n", GetLastError());
		return;
	}
	//2.读数据
	char szBuf[100] = { 0 };
	DWORD dwRead;
	//阻塞在这里 
	if (!ReadFile(hSlot, szBuf, 100, &dwRead, NULL)) {
		MessageBox(_T("读取失败"));
		CloseHandle(hSlot);
		//return;
	}
	else {
		MessageBox((CStringW)szBuf);
	}
}

发送数据

void CChildView::OnSend()
{
	LPCTSTR szSlotName = TEXT("\\\\.\\mailslot\\Mymailslot");
	//创建一个文件句柄
	HANDLE hMailSlot = CreateFile(szSlotName,
		FILE_GENERIC_WRITE,//权限
		FILE_SHARE_READ,//共享模式
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL
	);

	if (hMailSlot == INVALID_HANDLE_VALUE) {
		TRACE("CreateFile failed with %d\n", GetLastError());
		return;
	}
	//写入数据
	char szBuf[] = "北极熊猫很handsome";
	DWORD dwWrite;
	if (!WriteFile(hMailSlot, szBuf, strlen(szBuf) + 1, &dwWrite, NULL)) {
		MessageBox(_T("写入数据失败"));
		CloseHandle(hMailSlot);
		return;
	}
	CloseHandle(hMailSlot);
}

执行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/13066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PIC单片机-测试例程汇总

内容包括PIC单片机常用外设的测试例程。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易!目录:一、端口的定义与while(1)的使用二、延时1、通过语句延时程序(带参数) 2、通过语句延时程序&…

N3-PEG-NHS,Azide-PEG-NHS,叠氮-聚乙二醇-活性酯可用来修饰蛋白质

一、详情介绍 1、名称 英文:N3-PEG-NHS,Azide-PEG-NHS 中文:叠氮-聚乙二醇-活性酯 2、描述 Azide-PEG-NHS的分子量:Azide-PEG-NHS 1k,叠氮-聚乙二醇-活性酯 2k,叠氮-PEG-活性酯 5k,N3-PEG-…

rr来debug你的C/C++程序(Linux)

如何用rr来debug你的C/C程序(Linux) 想象一下如果你的程序某时会崩溃,但是不能稳定复现,你会如何debug它? 用传统debugger面临的问题就是你不知道这次运行的时候能不能复现,你猜测可能某段代码出现了问题,所以进行了一番检查。…

柔性制造物料抓取及加工系统设计

目 录 摘 要 I Abstract II 1 绪论 1 1.1 选题背景及意义 1 1.2 国内外研究现状 2 1.3六自由度并联机器人介绍 3 1.4研究主要内容 6 1.4.1主要设计要求 6 1.4.2技术参数 7 2柔性制造物料抓取及加工系统的结构及工作原理 8 2.1 并联运动机构概述 8 2.2 六自由度并联加工机器人总…

LTR (Learning to Rank): 排序算法 poitwise, pairwise, listwise常见方案总结

目录1 Learing to Rank介绍2 The Pointwise Approach3 The Pairwise Approach3.1 RankNet4 The Listwise Approach4.1 直接优化评测指标4.1.1 LambdaRank4.1.2 LambdaMART4.2 定义Listwise损失函数4.2.1 ListNet4.2.2 ListMLE5 排序评估指标5.1 Mean Reciprocal Rank (MRR)5.2 …

46-文本编辑器及文本处理

46-文本编辑器及文本处理常见文本编辑器linux文本编辑器介绍Linux文本编辑器-emacsLinux文本编辑器-nanoLinux文本编辑器- geditLinux文本编辑器- keditLinux文本编辑器- viLinux文本编辑器- vim使用vim编辑器vim基础操作-打开文件vim基础操作-移动光标vim基础操作–数据操作vi…

解决——》CommunicationsException:Communications link failure

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 解决——》CommunicationsException:Communications link failure1、操作2、现象3、原因4、解决1&…

大一新生HTML期末作业 学生个人网页设计作业 HTML5响应式个人简历网站模板 web前端网页制作课作业

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

【linux】登录审计

linux登录审计 桥接模式配置互联 VMware的“虚拟网络编辑器” 输入’nm-connection-editor’,配置以太网 为以太网连接配置网卡 配置ipv4 互ping ssh远程登录 ssh -l 用户名 ip地址exit退出ssh远程 [alexalexw-device ~]$ ssh -l alex 1.1.1.2 The au…

数据挖掘——RFM客户价值模型及航空公司客户分析实例

引言 背景信息时代的来临使得企业营销焦点从产品转向了客户,客户的管理关系成为企业的核心问题。客户的关系管理问题是客户分群。通过客户分群,进而区分无价值客户和高价值客户。高价值客户代表他们的消费会给企业带来利益最大。企业需要针对不同类别的…

易基因|病毒抗性:全基因组DNA甲基化揭示草鱼年龄相关病毒易感性的表观遗传机制

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 2022年06月02日,淡水生态与生物技术国家重点实验室(中国科学院水生生物研究所)何利波副研究员为第一作者和通讯作者,汪亚平研究员为共同通…

智慧市政解决方案-最新全套文件

智慧市政解决方案-最新全套文件一、建设背景二、思路架构三、建设方案四、获取 - 智慧市政全套最新解决方案合集一、建设背景 随着中国经济的快速发展,城市化步伐不断加快,为了适应城市发展与管理的需求,解决城市市政管理过程中的问题&#…

PDPS软件:机器人控制输送带运行虚拟仿真操作方法

目录 概述 旋转台设备运动机构介绍 旋转台设备模型导入与安装 旋转台设备操作创建 机器人控制旋转台设备离线程序命令添加 仿真运行 概述 旋转台也是工业机器人生产线中常用的外围设备,工件安装在旋转台的夹紧机构上,旋转台通过旋转实现工作位置的…

【Linux】进程地址空间

文章目录一、前言二、什么是进程地址空间三、进程地址空间如何进行管理四、为什么会存在进程地址空间五、进程地址空间区域的严格划分一、前言 学习Linux系统编程一共要翻越三座大山 – 进程地址空间、文件系统以及多线程,这三部分内容很难但是非常重要&#xff1b…

[附源码]Python计算机毕业设计java高校社团管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

GitCode / 1024程序员开源挑战赛(10.23-11.14)

目录 csdn也有云计算了 这个挑战赛,主要是向大家宣布了,咱们csdn也有自己的云计算了! 比较有特色的 云容器 云IDE 猿如意 也是有个有特色的工具,可以试用下。​编辑 问题 csdn也有云计算了 这个挑战赛,主…

0097 弗洛伊德算法,马踏棋盘算法

import java.util.Arrays; /* * 弗洛伊德算法 * 1.和迪杰斯特拉算法一样,弗洛伊德算法也是一种用于寻找给定的加权图中顶点间最短路径的算法 * 2.迪杰斯特拉算法用于计算图中某一顶点到其他顶点的最短路径 * 弗洛伊德算法计算图中各个顶点之间的最短路径 * …

IT就业专业为什么要选择大数据技术应用?

IT就业专业为什么要选择大数据技术应用?目前大数据领域从业人员的薪资高涨幅空间大,大数据人才供不应求。各大数据开发方向,数据挖掘、数据分析和机器学习方向,大数据运维和云计算方向。 一、大数据技术应用发展前景好&#xff1…

物联网协议MQTT

物联网协议MQTT 1.MQTT简介 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一…

必考设计模式

文章目录一、单例模式(创建型)1、饿汉式2、懒汉式3、双重检验锁(DCL)4、sync.once实现单例二、工厂模式(创建型)1、简单工厂模式2、工厂方法模式3、抽象工厂模式(暂时不写)三、装饰模…