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

news2024/12/15 21:09:02

目录

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.coloradmin.cn/o/2260136.html

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

相关文章

ubuntu+ros新手笔记(三)

系统ubuntu22.04 ros2 humble 1. 设置ubuntu终端字体大小 点击Terminal右上角的三条横线—>Preferences—>Unnamed—>Text—>勾选Custom font—>点击右侧的字号&#xff08;我的显示的是12&#xff09;—>最下方Size处设置字号大小—>Select—>设置完…

使用echarts实现3d柱状图+折线图

以下代码有问题请直接问国内直连GPT/Claude HTML 需要注意threeDchart一定要设置宽度高度&#xff0c;不然图不显示,然后echarts版本不要太低&#xff0c;不然也不显示 <div id"threeDchart" class"threeDchart"></div>js set3DBarChart2(dat…

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇 2024年的蓝桥杯即将拉开序幕&#xff01;对于许多编程爱好者来说&#xff0c;这不仅是一次展示自我能力的舞台&#xff0c;更是一次学习和成长的机会。作为一名大一新生的小蓝&#xff0c;对蓝桥杯充满了期待&#xff0c;但面对初次参赛的…

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

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

【Python】使用Selenium的find_element模块获取网页上的大段文字和表格的方法(建议收藏!)

发现了一个使用Selenium的find_element模块&#xff0c;快速获取文字和表格的方法&#xff0c;很实在&#xff0c;以后爬网的时候&#xff0c;就不用beautifulSoup 和 pandas的read_html 混起来用了&#xff01; 文字部分&#xff1a;实现网络节点下&#xff0c;某个节点下的其…

Pytest-Bdd-Playwright 系列教程(16):标准化JSON报告Gherkin格式命令行报告

Pytest-Bdd-Playwright 系列教程&#xff08;16&#xff09;&#xff1a;标准化JSON报告&Gherkin格式命令行报告 前言一、创建Feature文件二、创建步骤定义文件三、生成Cucumber格式的JSON报告四、使用Gherkin格式的命令行报告五、将BDD报告集成到Jenkins中总结 前言 在自动…

HDR视频技术之七:逆色调映射

HDR 技术近年来发展迅猛&#xff0c;在未来将会成为图像与视频领域的主流。当前 HDR 内容非常短缺&#xff0c;限制了 HDR 视听节目的广泛应用。逆色调映射(Inverse Tone Mapping)应运而生&#xff0c;它是一种用来将 SDR 源信号转换为 HDR 源信号的技术&#xff0c;可以应用于…

迎接全新的 Kotlin 支持 – K2 模式:基本信息

K2 模式有什么作用&#xff1f; K2 模式是 IntelliJ IDEA 中 Kotlin 支持的新实现&#xff0c;它可以提高 IDE 的稳定性&#xff0c;同时也会为支持未来 Kotlin 语言功能奠定基础。 K2 模式与 Kotlin K2 编译器有什么区别&#xff1f; K2 编译器负责编译 Kotlin 语言 2.0 或…

黑马程序员Java项目实战《苍穹外卖》Day12

苍穹外卖-day12 课程内容 工作台Apache POI导出运营数据Excel报表 功能实现&#xff1a;工作台、数据导出 工作台效果图&#xff1a; 数据导出效果图&#xff1a; 在数据统计页面点击数据导出&#xff1a;生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原…

活动报名:Voice Agent 开发者分享会丨RTE Meetup

引入 voice agent 的口语学习应用 Speak 估值已达 10 亿美元 Voice Agent 开发者分享会 一同探索语音驱动的下一代人机交互界面&#xff0c;一场 voice agent builder 的小规模深度交流会。 RTE Meetup 迎来第六期&#xff01;12 月 15 日&#xff08;周日&#xff09;上午&…

优化你的 3D Tiles:性能与质量的平衡

优化你的 3D Tiles&#xff1a;性能与质量的平衡 在现代的三维场景渲染中&#xff0c;3D Tiles 是一种强大的技术&#xff0c;它能以高效、分级加载的方式呈现海量的三维数据。然而&#xff0c;优化 3D Tiles 以实现性能与质量的平衡&#xff0c;却是一个复杂且关键的任务。本…

【K8S系列】在 Kubernetes 中使用 Prometheus 进行监控的详细指南

Prometheus 是一个开源的监控和报警工具&#xff0c;广泛用于 Kubernetes 环境中。本文将深入探讨如何通过 Kubernetes 中的注解配置 Prometheus 的抓取设置&#xff0c;以高效监控服务&#xff0c;并确保系统的可靠性和可维护性。 一、Prometheus 简介 Prometheus 是一个功能…

SEC_ASA 第一天作业

拓扑&#xff1a; 实验需求&#xff1a; 注意&#xff1a;在开始作业之前必须先读“前言”&#xff0c;以免踩坑&#xff01;&#xff01;&#xff01;&#xff08;☞敢点我试试&#xff09; 按照拓扑图配置VLAN连接。 注意&#xff1a;ASA防火墙的 Gi0/1口需要起子接口&#x…

基于STM32设计的工地扬尘与噪音实时监测系统(网页)

一、前言 当前项目使用的相关软件工具、传感器源代码工程已经上传到网盘&#xff08;实时更新项目内容&#xff09;&#xff1a;https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?fromfrom_copylink 1.1 项目开发背景 近年来&#xff0c;随着城市化进程的…

Vue项目打包部署到服务器

1. Vue项目打包部署到服务器 1.1. 配置 &#xff08;1&#xff09;修改package.json文件同级目录下的vue.config.js文件。 // vue.config.js module.exports {publicPath: ./, }&#xff08;2&#xff09;检查router下的index.js文件下配置的mode模式。   检查如果模式改…

KMP 字符串匹配详解

一、KMP 的作用 KMP 用于解决字符串匹配问题&#xff0c;当出现字符串不匹配时&#xff0c;可以知道一部分之前已经匹配的文本内容&#xff0c;可以利用这些信息避免从头再去做匹配了。 二、题目 链接&#xff1a;28. 找出字符串中第一个匹配项的下标 - 力扣&#xff08;Lee…

ElasticSearch01-概述

零、文章目录 ElasticSearch01-概述 1、Elastic Stack &#xff08;1&#xff09;简介 官网地址&#xff1a;https://www.elastic.co/cn/ELK是一个免费开源的日志分析架构技术栈总称&#xff0c;包含三大基础组件&#xff0c;分别是Elasticsearch、Logstash、Kibana。但实际…

12.2【JAVA EXP4]next.js的各种问题,DEBUG,前端补强,前后端交互,springSecurity ,java 配置,h2数据库

在服务器组件中使用了 useState 这样的 React Hook。useState 只能在客户端组件中使用&#xff0c;而不能在服务器组件中使用。Next.js 的新架构&#xff08;App Router&#xff09;中&#xff0c;默认情况下&#xff0c;页面和布局组件是服务器组件&#xff0c;因此不能直接使…

MySQL相关文件

配置文件 — — — — — — /etc/my.cnf datadir/var/lib/mysql //数据目录 socket/var/lib/mysql/mysql.sock //定义套接字文件存储位置&#xff0c;套接字文件&#xff08;IP&#xff1a;port&#xff09;,用于接收客户端连…

数字产业化和产业数字化到底是什么?

“数字产业化”和“产业数字化”在很多官方文件和领导人讲话中都是成对出现的&#xff0c;这两个术语看起来非常相似&#xff0c;但它们作为数字经济的两个重要组成部分&#xff0c;既有联系又有区别。 在谈数字产业化和产业数字化之前&#xff0c;我这里需要先给大家介绍一个概…