Windows核心编程之邮槽实现进程间通信

2023-05-16

    邮槽是Windows系统提供的一种单向通信的机制。即进程中的一方只能写入或读取数据,而另一方则只能读取或写入数据。通过邮槽,用户可以实现一对多或跨网络的进程之间的通信。但是,邮槽能传输的数据非常小,一般在400KB左右。如果用户操作的数据过大,可能会导致邮槽不能正常工作。

1.创建邮槽

    用户在实际编程时,可以使用Windows邮槽实现进程间通信。但是用户必须首先创建邮槽。在Windows系统中,用户可以通过函数CreateMailslot函数创建邮槽。函数原型如下:

HANDLE CreateMailslotW(
    LPCWSTR lpName,
    DWORD nMaxMessageSize,
    DWORD lReadTimeout,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes
    );
    该函数的作用是创建邮槽并返回该邮槽的句柄。如果函数调用成功,将返回创建邮槽的句柄。否则,函数将返回INVALID_HANDLE_VALUE,表示邮槽创建失败,参数说明如下:

    参数lpName表示邮槽的名称。邮槽名称的格式为“\\.\mailslot\name”。其中,name表示邮槽的名称。用户在c++开发环境中,应该将其指定为“\\\\.\\mailslot\\name”。如果用户在不同的主机上运行程序,则需要把名称字符串中的“.”换成对方主机名称。

    参数nMaxMessageSize 指定将通过邮槽发送或接收的消息的最大值,在实际编程中,一般将其设置为0,表示消息的大小为任意值。

    参数lReadTimeout表示程序读取操作的超时时间。如果该参数值为0,则当邮槽中没有任何消息时,该函数将立即返回。如果该函数值为MAILSLOT_WAIT_FOREVER,则表示该函数将等待,直到邮槽中有消息函数才返回。

    参数lpSecurityAttributes是指向结构体LPSECURITY_ATTRIBUTES的指针,表示邮槽的安全属性,一般情况下,将其设置为NULL,表示默认安全属性。

    一般情况下,函数CreateMailslot常被用于进程通信的服务方,客户端方使用CreateFile函数打开指定的邮槽,再进行相关操作。

2.操作邮槽

     用户对邮槽进行操作包括将数据写入邮槽和从邮槽中读取数据等。在实际编程时,操作邮槽和操作文件一样,都是通过调用函数ReadFile()和WriteFile()进行读写操作。函数原型如下:

BOOL ReadFile(
    HANDLE hFile,
    LPVOID lpBuffer,
   nNumberOfBytesToRead,
   LPDWORD lpNumberOfBytesRead,
    LPOVERLAPPED lpOverlapped
    );
BOOL WriteFile(
    HANDLE hFile,
    LPCVOID lpBuffer,
    DWORD nNumberOfBytesToWrite,
    LPDWORD lpNumberOfBytesWritten,
    LPOVERLAPPED lpOverlapped
    );

3.邮槽实例

服务端:

#include "stdafx.h"
#include <iostream>
#include <windows.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE mail;												//定义邮槽句柄
	//创建邮槽
	mail=CreateMailslot("\\\\.\\mailslot\\my",0,MAILSLOT_WAIT_FOREVER,NULL);

	if(mail==INVALID_HANDLE_VALUE)								//判断邮槽句柄
	{
		cout<<"创建邮槽失败!\r\n";								//提示信息
		return 0;
	}
	else
	{
		cout<<"创建邮槽成功,正在读取数据……!\r\n";
		char text[200];												//定义字符数组
		DWORD readtext;												//获取实际读取值
		while(1)
		{

			if(ReadFile(mail,text,200,&readtext,NULL))					//读取数据
			{
				cout<<text<<endl;												//显示数据
			}
		}
	}
	Sleep(100000);
	CloseHandle(mail);
	return 0;
}

客户端:

#include "stdafx.h"
#include <iostream>
#include <windows.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE mail2;												//定义邮槽句柄
	char text[]="您好,this is a message";						//初始化消息
	DWORD writetext;											//获取实际发送值
	mail2=CreateFile("\\\\.\\mailslot\\my",GENERIC_WRITE,FILE_SHARE_READ,
		NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	//打开文件
	if(INVALID_HANDLE_VALUE==mail2)	
	{
		cout<<"邮槽打开失败!\r\n";
	}
	else
	{		 
		if(WriteFile(mail2,text,sizeof(text),&writetext,NULL))	//写入数据
		{
			Sleep(1000);
			cout<<"数据写入成功\r\n";								//数据写入成功
		}
		else
		{
			cout<<"数据写入失败\r\n";
		}
		CloseHandle(mail2);											//关闭句柄
	}
	Sleep(10000);
	return 0;
}











本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows核心编程之邮槽实现进程间通信 的相关文章

  • 在 C# 中使用反射列出枚举中的值

    我正在尝试使用反射来列出一个 Visual Studio 解决方案内的各个项目中的一些类的公共成员和方法 我尝试访问的所有类都是 C 的 并且它们都是从 C 类访问的 我用来进行这些调用的代码如下 public void PopulateE
  • windows关闭tomcat后保持端口锁定

    我遇到了一个问题 该问题发生在不同站点的 3 台不同服务器上 问题是 当我关闭 Windows 服务器上的 Tomcat 7 和 8 5 版本 服务并尝试重新启动该服务后 该服务将无法启动 因为 tomcat 认为端口仍在使用中 以下是错误
  • Pip 无法在 Windows 上安装 Twisted

    我正在尝试在 Windows 8 计算机上安装 Twisted 在 Twisted 官方网站上 只有一个 Windows 版的 Wheel 文件 https twistedmatrix com trac wiki Downloads htt
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • 使用 BitmapEncoder 生成时如何使 GIF 循环重复

    我能够使用 BitmapEncoder C WinRT 创建动画 gif 但是 我一直无法弄清楚如何让GIF循环回来并从头开始 没有尝试太多 因为我不确定要尝试什么 搜索了更多要在 GIF 上设置的属性 但找不到任何相关内容 好吧 终于能弄
  • PostgreSql“运行安装后步骤...数据库集群初始化失败”

    我是一名 Windows 用户 我花了几个小时不断地安装和卸载 然后才使其正常工作 前 10 次左右才看到标题中的错误消息 我将其作为一个自我回答的问题放在这里 以防止其他人在安装时可能遇到同样的问题 并为像我这样第一次使用 Postgre
  • 如何使用 python 在 Windows 中禁用/启用特定 USB 端口? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在图形窗口中创建一个切换开关 可以使用 python 禁用 启用 Windows 中的特定 USB 端口 我可以使用哪个外部命令或
  • 哪个版本的 Miniconda 具有适用于 Windows 64 位的 Python 3.6?

    我正在开发一个需要这些深度学习库的项目 keras 和 tensorflow 不幸的是 这些不适用于 Python 3 7 有人可以告诉我一个带有 Python 3 6 的 Miniconda 版本 适用于 Windows 64 位 吗 我
  • MinGW Make 抛出“系统找不到指定的路径。”错误

    我正在尝试在 Windows 7 上使用 cmake 生成一个 c 项目 在实际创建项目之前 cmake 会对您的工具链进行快速测试 我正在使用 MinGW 这就是我的问题所在 Cmake 触发 make 构建 最终失败并返回 系统找不到指
  • 无法启动 Windows 服务,错误 1064

    我编写了一个在 Win10 上运行的 Windows 服务 它运行得非常好 直到我决定对其进行一些更改 我重写了一些逻辑 在调试和发布配置中进行了测试 一切都很好 然后 我使用卸载了当前版本的服务installutil exe u serv
  • 批处理脚本 FOR 循环仅设置输出的第一个字母 wsl --list -q

    我正在编写一个批处理脚本 将文件从 Windows 目录复制到 WSL 发行版 其中一部分是选择将文件复制到哪个发行版 如果我使用命令wsl list q如果给我以下输出 Ubuntu 22 04 Ubuntu 18 04 我正在尝试使用此
  • 在运行时,我如何判断我是否在 WinXP+ 上? win32

    我正在进行一些 win32 字符串 API 调用 并假设字符串以宽字符串形式出现 这在 XP 和更高版本上有效 我该如何断言这一点 这是运行时检查还是编译时检查 我做错了吗 这是一个例子 typedef std basic string
  • Jenkins 可以检测到任何 svn 用户每次提交代码吗?

    Jenkins 可以检测到任何 svn 用户每次提交代码吗 我想知道每次 Jenkins 提交 svn user 时 有什么方法或 jenkins 插件吗 现在我用svn updateJenkins 中的 cmd 来更新 svn 您可以按照
  • 防止 WNetAddConnection2 类允许被禁止的用户访问共享文件夹

    我开发了 C windows 应用程序 操作系统是Windows 7 要求 是使用带有凭据的代码访问网络共享文件夹 Test WNetAddConnection2 class 限制 是某些用户可以访问此共享文件夹 测试 但对于其他用户 设置
  • 如何设置任务在使用 vbs 登录时以当前用户身份运行而无需管理员权限?

    从命令行 我可以创建一个在登录时运行的计划任务 无需管理员权限或用户输入密码来设置任务 但是我必须使用 xml 文件来执行此操作 下面是一个示例 xml 其中 Domain User 部分必须在运行时替换为当前用户的域和名称
  • conio.h 不包含 textcolor()?

    我一直在考虑在我用 C 编写的 DOS 程序中使用颜色 有人告诉我conio h有textcolor 函数 但是当我在代码中使用它时 编译器 链接器会向我抛出错误 说我对该函数有未定义的引用 Does conio h真的有这个功能还是有人告
  • Node.js 升级在 Windows 中仍然显示旧版本

    我已使用 msi 安装程序下载并安装了新版本的 nodejs 4 1 2 之后我跑了node v 但它仍然显示旧版本 0 12 2 我尝试重新启动Windows 甚至卸载nodejs并重新安装它 但仍然显示相同的内容 为什么会发生这种情况
  • 在 Windows 上查找父进程 ID

    Problem 给定远程 Windows 主机上的进程 ID 和命令行访问权限 如何找到其父进程的 PID Solution 鉴于 Marc B 的回答 我们可以使用 WMIC 命令示例here https learn microsoft
  • 从其可执行文件的路径获取服务名称

    我有一个可执行文件的路径 它是一个正在运行的服务应用程序 例如 C Program Files x86 Someapp somesvc exe 我想停止并启动它 为此我想我需要获取服务的名称 如下所示 this https stackove
  • sqlite3-ruby gem:无法构建 gem 本机扩展

    Update 看看这个后续问题 Windows 上的 Gem 更新 它坏了吗 https stackoverflow com questions 134581 gem update on windows is it broken 在 Win

随机推荐

  • Unity3D中uGUI事件系统简述及使用方法总结

    Unity3D的uGUI系统的将UI可能触发的事件分为12个类型 xff0c 即EventTriggerType枚举的12个值 如下图所示 xff1a 先以PointerClick为例 这个是用于某点点击事件 其他事件都可以根据相同的办法调
  • USB 2.0 A型、B型、Mini和Micro接口 type-c 定义及封装

    USB全 称Universal Serial Bus xff08 通用串行总线 xff09 xff0c 目前USB 2 0接口分为四种类型A型 B型 Mini型还有后来补充的Micro型接口 xff0c 每种接口都分插头和插座两个部分 xf
  • UVC摄像头开发(一)

    近期 xff0c 要做一个usb摄像头的开发 xff0c 然后看了韦东山老师的第三期视频 xff0c 讲UVC协议摄像头开发的教程 做一些记录 xff0c 以免忘记 1 当我们拿到一个摄像头 xff0c 怎么知道它的一些信息呢 xff1f
  • 分析锂电池充放电保护电路的特点及工作原理

    锂在元素周期表上位于第3位 xff0c 因外层电子数为1个 xff0c 容易失去从而形成稳定结构 xff0c 故锂是一种非常活泼的金属 由锂元素制成的锂离子电池 xff0c 具有放电电流大 内阻低 寿命长 无记忆效应等优点 xff0c 现已
  • vscode相关配置

    转载 作者 ifredom 原文链接 xff1a https blog csdn net win7583362 article details 79315055 配置详解 editor是针对vscode的风格设置 例如 tabSize xf
  • odroid x2安装ubuntu系统,HDMI显示,说说折腾事儿。

    安装的是Lubuntu14 04 xff0c odroid官网有下载 xff0c 烧写软件用官网下载的win32disk imager for odroid 不要用通用的win32disk image 可能不行 write烧写完毕之后记得v
  • VC http post 文件到服务器

    首先引入 include 34 afxinet h 34 其次准备好HTTP POST服务器 STDMETHODIMP CPostPDFToA4 t5PostPDFToA4 BSTR strFileName BSTR strFileFull
  • 宏参数

    一 可变参数宏 和 VA ARGS 1 1 直接替代 结果 xff1a weight 61 1 shipping 61 2 span class hljs comment define PR printf VA ARGS span PR s
  • 记Datax3.0解决MySQL抽数到HDFSNULL变为空字符的问题

    一 背景 使用Datax3 0 地址 xff1a https github com alibaba DataX 在HDFS读的时候开放了如下nullFormat选项 xff1a nullFormat 描述 xff1a 文本文件中无法使用标准
  • vector用法总结(定义,操作,方法,注意点)

    一 vector的基本概念 vector是同一种类型的对象的集合 xff0c 每个对象都有一个对应的整数索引值 和string对象一样 xff0c 标准库负责管理存储元素的相关内存 我们把vector称为容器 xff0c 是因为它可以包含其
  • windows c编写串口通信

    一 介绍 平时调试协议直接上其他平台不方便调试 xff0c 这里以windows平台的c语言实现串口通信 二 准备 1 串口调试助手 2 虚拟串口工具 3 dev c 43 43 4 vscode xff08 可以不用 xff09 三 代码
  • C++接口定义及实现举例

    C 43 43 接口定义及实现举例 一 接口的定义 有时候 xff0c 我们得提供一些接口给别人使用 接口的作用 xff0c 就是提供一个与其他系统交互的方法 其他系统无需了解你内部细节 xff0c 并且也无法了解内部细节 xff0c 只能
  • 2016年终总结

    关键点 xff1a 程序员修炼之道Java编程思想 xff08 Java并发 异常处理 xff09 代码大全2Bat批处理Shell编程正则表达式Shader之初体验Unity5 x资源打包和加载Android单机游戏 xff0c 医疗项目
  • 嵌入式debian没有lsusb命令解决

    问题 bash lsusb command not found 解决
  • Postman抓包教程

    目录 什么是抓包 xff1f 如何使用 Postman 进行抓包 查看历史抓包数据 使用抓包数据进行接口测试和开发 抓包技巧和注意事项 什么是抓包 xff1f 在计算机网络中 xff0c 抓包是指捕获网络流量的过程 抓包工具可以截获进出计算
  • Cmakelists 使用 gcc/g++

    转载 https blog csdn net afei article details 81201039 常用变量 预定义变量 PROJECT SOURCE DIR xff1a 工程的根目录 PROJECT BINARY DIR xff1a
  • ROS 环境配置问题

    如果 roslaunch beginner tutorials turtlemimic launch 发现 turtlemimic launch is neither a launch file in package beginner tu
  • getdate()函数

    定义和用法 getdate 函数取得日期 xff0f 时间信息 语法 getdate timestamp 参数 描述 timestamp 可选 规定 Unix 时间格式中的时间 说明 返回一个根据 timestamp 得出的包含有日期信息的
  • linux系统的嵌入式设备调试422串口

    1 登陆linux系统 xff0c 查看当前可用的设备 xff0c 在终端输入 xff1a dmesg grep ttyS 例如会显示如下 xff0c 当前ttyS0可用 2 可先使用linux系统中的串口调试工具 cutecom 检查线路
  • Windows核心编程之邮槽实现进程间通信

    邮槽是Windows系统提供的一种单向通信的机制 即进程中的一方只能写入或读取数据 xff0c 而另一方则只能读取或写入数据 通过邮槽 xff0c 用户可以实现一对多或跨网络的进程之间的通信 但是 xff0c 邮槽能传输的数据非常小 xff