[C#与C++交互] 跨进程通信NamedPipes

目录

1、前言

2、什么是命名管道?

3、实现步骤

4、示例代码

4.1 C++ 服务器代码

4.2 C# 客户端代码

5、运行步骤

6、注意事项

7、应用场景

8、优缺点

9、总结


1、前言

在 C# 和 C++ 应用程序之间进行数据交换时,命名管道(Named Pipes)是一种简单高效的进程间通信(IPC)方式。命名管道提供了可靠的双向通信通道,适合用于同一台机器上的跨进程通信。本文将深入介绍如何在 C# 和 C++ 程序中使用命名管道进行数据传输,包括详细的示例代码,帮助读者在实践中使用并调试这一技术。

2、什么是命名管道?

命名管道是 Windows 提供的一种 IPC 机制,支持双向数据流。与匿名管道不同,命名管道可以跨进程、跨用户访问。管道是由一个唯一的名称标识的,因此不同程序可以通过名称找到并使用相同的管道。命名管道适合中小规模的数据交换,对数据实时性和可靠性要求高的场景。

3、实现步骤

C++ 端:创建命名管道并写入数据

使用 Windows API CreateNamedPipe 创建管道。
通过 WriteFile 写入数据到管道。
调用 CloseHandle 关闭管道。
C# 端:连接到命名管道并读取数据

使用 NamedPipeClientStream 连接管道。
通过 StreamReader 读取数据。
关闭连接。


4、示例代码

下面的代码展示了一个完整的跨进程通信实例。C++ 程序作为管道服务器,创建命名管道并发送消息;C# 程序作为客户端,从管道读取数据。

4.1 C++ 服务器代码

首先,我们创建一个名为“MyPipe”的管道,并写入一条文本消息到管道中:

#include <windows.h>
#include <iostream>int main() {// 创建命名管道HANDLE hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\MyPipe"),PIPE_ACCESS_OUTBOUND,PIPE_TYPE_BYTE | PIPE_WAIT,1, 0, 0, 0, NULL);if (hPipe == INVALID_HANDLE_VALUE) {std::cerr << "Failed to create named pipe. Error: " << GetLastError() << std::endl;return 1;}// 等待客户端连接std::cout << "Waiting for client connection..." << std::endl;if (ConnectNamedPipe(hPipe, NULL)) {const char* message = "Hello from C++";DWORD bytesWritten;if (WriteFile(hPipe, message, strlen(message) + 1, &bytesWritten, NULL)) {std::cout << "Message sent to client." << std::endl;} else {std::cerr << "Failed to write to pipe. Error: " << GetLastError() << std::endl;}} else {std::cerr << "Failed to connect to named pipe. Error: " << GetLastError() << std::endl;}// 关闭管道句柄CloseHandle(hPipe);return 0;
}


代码解析:

  • CreateNamedPipe:创建一个名为“MyPipe”的命名管道,指定为字节流类型(PIPE_TYPE_BYTE)。
  • ConnectNamedPipe:等待客户端连接。
  • WriteFile:将文本消息写入管道中。

4.2 C# 客户端代码

C# 客户端程序连接到同名的管道,并读取消息:

using System;
using System.IO;
using System.IO.Pipes;class Program {static void Main() {// 连接到命名管道using (var pipeClient = new NamedPipeClientStream(".", "MyPipe", PipeDirection.In)) {pipeClient.Connect();// 读取数据using (var reader = new StreamReader(pipeClient)) {string message = reader.ReadToEnd();Console.WriteLine("Received from C++: " + message);}}}
}


代码解析:

  • NamedPipeClientStream:创建命名管道客户端,连接到“MyPipe”管道。
  • StreamReader:用于从管道中读取数据,直到读取完毕。


5、运行步骤

编译并运行 C++ 服务器程序,等待客户端连接。
运行 C# 客户端程序,连接到管道并读取消息。
在运行过程中,C++ 服务器程序会输出“Waiting for client connection...”,当客户端连接后,客户端会显示从管道中接收到的消息“Received from C++: Hello from C++”

6、注意事项

命名管道名称:管道的名称在服务器和客户端之间必须一致。通常采用 \\.\pipe\PipeName 的格式,其中 PipeName 为自定义名称。
双向通信:可以通过设置 PIPE_ACCESS_DUPLEX 实现双向通信,此时需要在服务器和客户端都调用 ReadFile 和 WriteFile。
异常处理:在生产环境中,建议加入更多的异常处理,确保管道连接中断时能够正确地释放资源。

7、应用场景

命名管道非常适合用于以下场景:

单机多进程数据交换:例如监控和控制系统,其中一个进程负责采集数据,另一个进程负责数据处理。
实时数据传输:如实时日志记录,将数据从一个程序实时传输到另一个程序中进行存储或分析。

8、优缺点

优点:

支持双向通信。
简单易用,无需复杂的网络配置。
支持多客户端连接同一个命名管道。
缺点:

仅适合同一台计算机上的进程间通信。
传输速率相对较慢,不适合大规模数据传输。

9、总结

命名管道是一种高效、可靠的 IPC 方式,在需要简单、双向的本地通信场景中非常适用。通过使用 C# 和 C++ 两种语言编写的示例程序,展示了如何创建和使用命名管道实现跨进程的数据传输。在实际应用中,可以根据业务需求调整管道名称、数据流向和异常处理,使其更好地服务于系统需求。

在下一篇文章中,我们将讨论如何使用 套接字(Sockets) 进行跨进程通信,这种方法支持跨网络的数据传输,适用于分布式系统。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《宇宙机器人》提示错误弹窗“找不到d3dx9_43.dll”是什么原因?“d3dx9_43.dll缺失”怎么解决?

电脑游戏运行时常见问题解析&#xff1a;《宇宙机器人》提示“找不到d3dx9_43.dll”的解决之道 TGA2024落幕&#xff0c;年度最佳游戏——《宇宙机器人》&#xff0c;作为一名在软件开发领域深耕多年的从业者&#xff0c;我深知电脑游戏在运行过程中可能会遇到的各种挑战&…

Hive-4.0.1数据库搭建(可选配置用户名密码远程连接)

1.官网下载tar包上传到服务器并解压&#xff08;我这里解压到了hive目录): 2.进入到conf目录&#xff0c;并复制模板配置文件进行修改&#xff1a; cd /apache-hive-4.0.1-bin/conf cp hive-default.xml.template hive-site.xml3.编写内容如下&#xff1a; <property>&…

计算机内存里面4个字节与float类型数据的转换原理

在计算机科学中&#xff0c;四个字节与float&#xff08;单精度浮点数&#xff09;之间的转换是一种常见的操作。这种转换涉及到数据类型的转换和内存存储的相关知识&#xff0c;其原理主要基于IEEE 754标准。以下是对四个字节和float转换原理的详细解释&#xff1a; 一、基本…

MATLAB 识别色块和数量

文章目录 前言步骤 1: 读取图像步骤 2: 转换为 HSV 颜色空间步骤 3: 定义颜色范围步骤 4: 创建颜色掩码步骤 5: 应用形态学操作&#xff08;可选&#xff09;步骤 6: 标记和显示结果完整代码步骤七 返回色块坐标 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&…

抓包分析DHCP的工作过程

一、DHCP简介 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;动态主机配置协议&#xff0c;前身是BOOTP协议。在大型局域网中&#xff0c;需要给很多主机配置地址信息&#xff0c;如果采用传统手工配置&#xff08;累死&#xff09;&#xff0c;效率太低&am…

MUR3060PTR-ASEMI快恢复二极管对管MUR3060PTR

编辑&#xff1a;ll MUR3060PTR-ASEMI快恢复二极管对管MUR3060PTR 型号&#xff1a;MUR3060PTR 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 正向电流&#xff1a;30A 反向电压&#xff1a;600V 正向压降&#xff1a;0.98V~1.90V 引线数量&#xff1a;3 芯片个数&a…

CSS学习记录13

CSS组合器 组合器是解释选择器之间关系的某种机制。CSS选择器可以包含多个简单选择器。在简单选择器之间&#xff0c;我们可以包含一个组合器。 CSS中有四种不同的组合器&#xff1a; 后代组合器&#xff08;空格&#xff09;子选择器&#xff08;>)相邻兄弟选择器&#…

城市大脑新型智慧城市数据中台建设方案

建设背景与现状 随着城市化进程的加速&#xff0c;城市数据呈现出爆炸式增长&#xff0c;但数据的整合、共享和利用却面临诸多挑战。信息孤岛、数据冗余、管理分散等问题日益突出&#xff0c;制约了智慧城市的发展。为了解决这些问题&#xff0c;构建城市大脑新型智慧城市数据…

LeetCode 热题 100-两数之和(简单)

1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。…

【echarts】数据过多时可以左右滑动查看(可鼠标可滚动条)

1. 鼠标左右拖动 在和 series 同级的地方配置 dataZoom&#xff1a; dataZoom: [{type: inside, // inside 鼠标左右拖图表&#xff0c;滚轮缩放&#xff1b; slider 使用滑动条start: 0, // 左边的滑块位置&#xff0c;表示从 0 开始显示end: 60, // 右边的滑块位置&#xf…

将VSCode添加至右键的菜单栏

文章目录 打开注册表编辑器共需要在3处添加&#xff1a;第一处&#xff1a;第二处&#xff1a;第三处&#xff1a;最终效果&#xff1a; 原文链接&#xff1a; https://www.cnblogs.com/alannxu/p/18234323 打开注册表编辑器 1、打开运行界面&#xff1a;WinR 2、在弹出的运行…

【ArcGIS】基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作

第一章、以问题导入的方式&#xff0c;深入掌握原理基础【理论篇】 1、R语言入门&#xff1a; &#xff08;1&#xff09;安装R及集成开发环境&#xff08;IDE&#xff09;&#xff1b;&#xff08;2&#xff09;R语言基础语法与数据结构&#xff0c;包括&#xff1a;程序包安…

下载与使用PCL启动器(2.8.12正式版)

一.下载PCL启动器 PCL启动器下载官网&#xff1a;爱发电 连接创作者与粉丝的会员制平台将创作的自由还给创作者&#xff01;爱发电是让创作者简单地获得稳定收入的粉丝赞助平台。无论你在创作什么&#xff0c;都能在这里获得持续的资金支持&#xff0c;让创作从此更自由。htt…

JVM 栈帧结构详解

在 Java 虚拟机&#xff08;JVM&#xff09;中&#xff0c;栈帧&#xff08;Stack Frame&#xff09;是用于支持方法调用和方法执行的关键数据结构。每个方法从调用开始到执行完成&#xff0c;都对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。本文将详细介绍 JVM 栈帧的结构及…

python学opencv|读取图像(七)抓取像素数据顺利修改图像大小

【1】引言 前序我们已经学习图像的基本读取操作&#xff0c;文章链接为&#xff1a; python学opencv|读取图像-CSDN博客 也掌握了彩色图像的保存&#xff1a; python学opencv|读取图像&#xff08;二&#xff09;保存彩色图像_python opencv 读取图像转为彩色-CSDN博客 以…

CSS|07 标准文档流

标准文档流 一、什么是标准文档流 在制作的 HTML 网页和 PS 画图软件画图时有本质上面的区别: HTML 网页在制作的时候都得遵循一个“流的规则:从左至右、从上至下。 使用 Ps 软件画图时可以在任意地方画图。 <!DOCTYPE html> <html lang"en"> <hea…

git的卸载与安装

目录 一、Git的卸载 二、Git的安装 2.1.1 官网下载 2.1.2 镜像下载 ​编辑 2.2 安装 2.3 检验否安装成功 三、Git使用配置 一、Git的卸载 1.找到程序&#xff0c;卸载程序 2.找到Git&#xff0c;右键卸载 卸载完成&#xff01; 二、Git的安装 2.1.1 官网下载 网址&…

探索 Echarts 绘图:数据可视化的奇妙之旅

目录 一、Echarts 初印象 二、搭建 Echarts 绘图环境 三、绘制第一个图表&#xff1a;柱状图的诞生 四、图表的美化与定制&#xff1a;让数据更具吸引力 1. 主题切换&#xff1a;一键变换风格 2. 颜色调整&#xff1a;色彩搭配的艺术 3. 标签与提示框&#xff1a;丰富信…

location重定向和nginx代理

文章目录 1 location重定向1.1 概述1.2 rewrite跳转1.3 用例1.4 实验1.4.1 基于域名的跳转1.4.2 基于ip的跳转1.4.3 基于后缀名的跳转 2 nginx的代理2.1 nginx内置变量2.2 正向代理2.2.1 固定正向代理2.2.2 自动代理 2.3 反向代理2.3.1 负载均衡的算法2.3.2 负载均衡的特点2.3.…

前端-自定义Ant Design 表格(可编辑表格)

选取的的是&#xff1a;表格 Table - Ant Design 其实ant design本身就有增加和删除单列数据的封装好的表格&#xff0c;但是个人觉得那个功能繁多&#xff0c;自己实现封装也便于之后理解和二次使用。 初步效果&#xff08;舍去切换样式的功能&#xff09;&#xff1a; 突破的…