C#与C++交互开发系列(十八):跨进程通信之命名管道(Named Pipes)

在这里插入图片描述

1、前言

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

2、什么是命名管道?

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

3、实现步骤

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

    • 使用 Windows API CreateNamedPipe 创建管道。
    • 通过 WriteFile 写入数据到管道。
    • 调用 CloseHandle 关闭管道。
  2. 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、运行步骤

  1. 编译并运行 C++ 服务器程序,等待客户端连接。
  2. 运行 C# 客户端程序,连接到管道并读取消息。

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

在这里插入图片描述

6、注意事项

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

7、应用场景

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

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

8、优缺点

  • 优点

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

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

9、总结

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

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

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

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

相关文章

uniapp的video视频属性打包app后层级过高

问题&#xff1a;在使用uniapp开发APP时&#xff0c;使用video标签显示视频发现H5可以正常展示&#xff0c;但是打包到APP后&#xff0c;它的层级过高&#xff0c;把底部导航都盖住了。 官网说明&#xff1a;uni-app官网 官网给了cover-view组件或plus.nativeObj.view、subNVue…

【linux 多进程并发】0302 Linux下多进程模型的网络服务器架构设计,实时响应多客户端请求

0302 多进程网络服务器架构 ​专栏内容&#xff1a; postgresql使用入门基础手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 一、概…

SQLI LABS | Less-26 GET-Error Based-All Your SPACES And COMMENTS Belong To Us

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-25/ 本关考察…

XML标记语言

最近在学XXE-XML外部实体注入漏洞时候&#xff0c;浅浅学习了一下XML&#xff0c;谨做此学习笔记。 目录 一&#xff1a;XML概述 二&#xff1a;XML语法 XML中的CDATA 三&#xff1a;使用PHP解析XML文档 添加节点 四&#xff1a;Xpath语言 绝对查找 相对查找 使用*匹配…

详解:模板设计模式

模板设计模式&#xff08;Template Pattern&#xff09;是一种行为设计模式&#xff0c;在软件设计中有着广泛的应用&#xff0c;旨在提高代码的可维护性和可复用性。 一、定义与特点 定义&#xff1a; 模板设计模式定义了一个算法的骨架&#xff0c;将某些步骤推迟到子类中实…

《向量数据库指南》——RAG质量评估与监控,打造高效AI引擎

嘿,各位向量数据库的小伙伴们,我是你们的老朋友王帅旭,大禹智库的向量数据库高级研究员,也是那本被大家津津乐道的《向量数据库指南》的作者。今天咱们来聊聊一个特别重要但又经常被忽视的话题——质量评估与监控,这可是确保咱们RAG(检索增强生成)系统稳定高效运行的关键…

Verilog HDL基础

模块的基本结构 module 模块名(端口列表); // 模块声明// 端口定义input [数据类型] [位宽] 输入端口列表; output [数据类型] [位宽] 输出端口列表; inout [数据类型] [位宽] 双向端口列表; // 数据类型定义wire [位宽] 线网名,线网名&#xff0c;…; …

HarmonyOS NEXT 应用开发实战(九、知乎日报项目详情页实现详细介绍)

在本篇博文中&#xff0c;我们将探讨如何使用 HarmonyOS Next 框架开发一个知乎日报的详情页&#xff0c;逐步介绍所用到的组件及代码实现。知乎日报是个小巧完整的小项目&#xff0c;这是一个循序渐进的过程&#xff0c;适合初学者和有一定开发经验的工程师参考。 1. 项目背景…

SpringBoot+FileBeat+ELK8.x版本收集日志

一、准备环境 1、ElasticSearch&#xff1a;8.1.0 2、FileBeat&#xff1a;8.1.0 3、Kibana&#xff1a;8.1.0 4、logstach&#xff1a;8.1.0 本次统一版本&#xff1a;8.1.0,4个组件&#xff0c;划分目录&#xff0c;保持版本一致。 说明&#xff1a;elasticsearch和kib…

UML介绍-不同类间关系

目录 不同的类间关系有着各自独特的体现方式。 继承关系 实现关系 关联关系 聚合关系 组合关系 数据库建模PowerDesigner UML&#xff08;Unified Modeling Language&#xff09;即统一建模语言&#xff0c;是一种用于软件系统分析、 设计和文档编制的可视化建模语言。…

C语言 | Leetcode C语言题解之第528题按权重随机选择

题目&#xff1a; 题解&#xff1a; typedef struct {int* pre;int preSize;int total; } Solution;Solution* solutionCreate(int* w, int wSize) {Solution* obj malloc(sizeof(Solution));obj->pre malloc(sizeof(int) * wSize);obj->preSize wSize;obj->total…

Yocto 项目中 layer.conf 文件的基本框架与模版

一个在layer.conf文件的基本框架&#xff1a; # 层的名称&#xff0c;可自定义&#xff0c;用于标识该层 LCONF_VERSION "7" LAYERNAME "my_layer"# 层的优先级&#xff0c;整数&#xff0c;用于确定层在构建顺序中的位置 # 数字越大&#xff0c;优先级…

计算机毕业设计Hadoop+大模型地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Spark 机器学习 深度学习 Flink 大数据

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (1) - 让 OpenGLES 应用跑起来

在正式移植 AWTK 之前&#xff0c;我们先尝试在 HarmonyOS 上运行一个简单的 OpenGLES 应用程序。虽然可以确定这一步肯定是可行的&#xff0c;但是作为一个 HarmonyOS NEXT 新手&#xff0c;还是先从简单的应用程序开始&#xff0c;把坑都踩一遍&#xff0c;遇到问题比较好解决…

Node.js:内置模块

Node.js&#xff1a;内置模块 Node.jsfs模块读取文件写入文件__dirname path模块路径拼接文件名解析 http模块创建服务 Node.js 传统的JavaScript是运行在浏览器的&#xff0c;浏览器就是其运行环境。 浏览器提供了JavaScript的API&#xff0c;以及解析JavaScript的解析引擎&a…

《Web性能权威指南》-WebRTC-读书笔记

本文是《Web性能权威指南》第四部分——WebRTC的读书笔记。 第一部分——网络技术概览&#xff0c;请参考网络技术概览&#xff1b; 第二部分——无线网络性能&#xff0c;请参考无线网络性能&#xff1b; 第三部分——HTTP&#xff0c;请参考HTTP&#xff1b; 第四部分——浏览…

vscode ssh连接autodl失败

autodl服务器已开启&#xff0c;vscode弹窗显示连接失败 0. 检查状态 这里的端口和主机根据自己的连接更改 ssh -p 52165 rootregion-45.autodl.pro1. 修改config权限 按返回的路径找到config文件 右键--属性--安全--高级--禁用继承--从此对象中删除所有已继承的权限--添加…

HTML 基础标签——多媒体标签<img>、<object> 与 <embed>

文章目录 1. `<img>` 标签主要属性示例注意事项2. `<object>` 标签概述主要属性示例注意事项3. `<embed>` 标签概述主要属性示例注意事项小结在现代网页设计中,多媒体内容的使用变得越来越重要,因为它能够有效增强用户体验、吸引注意力并传达信息。HTML 提…

Android——横屏竖屏

系统配置变更的处理机制 为了避免横竖屏切换时重新加载界面的情况&#xff0c;Android设计了一中配置变更机制&#xff0c;在指定的环境配置发生变更之时&#xff0c;无需重启活动页面&#xff0c;只需执行特定的变更行为。该机制的视线过程分为两步&#xff1a; 修改 Androi…

宝塔使用clickhouse踩坑

前言 最近有个物联网项目&#xff0c;需要存储物联网终端发送过来的信息&#xff08;类似log日志&#xff0c;但又要存储在数据库里&#xff0c;方便后期聚合统计&#xff09;&#xff0c;本来想写文件的奈何客户要求聚合统计&#xff0c;所以只能用数据库才能达到更高的计算效…