Protocol Buffers c# with c++ communcation demo

server/2025/2/2 22:46:17/

以下内容完全由AI 生成

以下是一个 Protocol Buffers 在 C# 和 C++ 之间进行通信的示例,包含定义 .proto 文件、分别在 C# 和 C++ 中生成代码、实现简单的发送和接收逻辑

1. 定义 .proto 文件

创建一个名为 message.proto 的文件,定义一个简单的消息类型:

syntax = "proto3";package communication;message MyMessage {string text = 1;int32 number = 2;
}

2. 生成代码

C# 代码生成

使用 protoc 编译器生成 C# 代码:

protoc --csharp_out=. message.proto

这会在当前目录下生成 Message.cs 文件。

C++ 代码生成
protoc --cpp_out=. message.proto

这会生成 message.pb.h 和 message.pb.cc 文件。

3. C++ 端实现

创建一个 C++ 项目,包含 message.pb.h 和 message.pb.cc 文件,以下是一个简单的发送和接收示例:

#include <iostream>
#include <fstream>
#include <string>
#include "message.pb.h"// 发送消息
void sendMessage(const std::string& text, int32_t number) {communication::MyMessage message;message.set_text(text);message.set_number(number);std::fstream output("message.bin", std::ios::out | std::ios::binary);if (!message.SerializeToOstream(&output)) {std::cerr << "Failed to serialize message." << std::endl;}
}// 接收消息
void receiveMessage() {communication::MyMessage message;std::fstream input("message.bin", std::ios::in | std::ios::binary);if (!message.ParseFromIstream(&input)) {std::cerr << "Failed to parse message." << std::endl;return;}std::cout << "Received message:" << std::endl;std::cout << "Text: " << message.text() << std::endl;std::cout << "Number: " << message.number() << std::endl;
}int main() {sendMessage("Hello from C++!", 42);receiveMessage();return 0;
}

4. C# 端实现

创建一个 C# 控制台项目,添加生成的 Message.cs 文件,并添加 Google.Protobuf NuGet 包。以下是 C# 端的发送和接收示例:

using System;
using System.IO;
using Google.Protobuf;
using communication;class Program
{// 发送消息static void SendMessage(string text, int number){MyMessage message = new MyMessage{Text = text,Number = number};using (FileStream output = new FileStream("message.bin", FileMode.Create)){message.WriteTo(output);}}// 接收消息static void ReceiveMessage(){MyMessage message;using (FileStream input = new FileStream("message.bin", FileMode.Open)){message = MyMessage.Parser.ParseFrom(input);}Console.WriteLine("Received message:");Console.WriteLine($"Text: {message.Text}");Console.WriteLine($"Number: {message.Number}");}static void Main(){SendMessage("Hello from C#!", 123);ReceiveMessage();}
}

5. 编译和运行

C++ 编译

使用以下命令编译 C++ 代码:

g++ -o cpp_demo message.pb.cc main.cpp -lprotobuf

运行编译后的可执行文件:

./cpp_demo
C# 编译和运行

在 Visual Studio 中,直接运行 C# 项目即可。

注意事项

  • 上述示例使用文件进行数据的传输,在实际应用中,你可能需要使用网络套接字(如 TCP 或 UDP)进行通信。
  • 确保 C++ 和 C# 项目都正确包含了 Protocol Buffers 库。
  • 对于网络通信,你需要处理连接建立、数据传输的可靠性等问题。

通过以上步骤,你可以实现 C# 和 C++ 之间使用 Protocol Buffers 进行通信。


http://www.ppmy.cn/server/164449.html

相关文章

(笔记+作业)书生大模型实战营春节卷王班---L1G3000 浦语提示词工程实践

学员闯关手册&#xff1a;https://aicarrier.feishu.cn/wiki/QtJnweAW1iFl8LkoMKGcsUS9nld 课程视频&#xff1a;https://www.bilibili.com/video/BV13U1VYmEUr/ 课程文档&#xff1a;https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/Python 关卡作业&#xff1a;htt…

MySQL 9.2.0 的功能

MySQL 9.2.0 的功能 MySQL 9.2.0 的功能新增、弃用和删除内容如下&#xff1a; 新增功能 权限新增12&#xff1a;引入了CREATE_SPATIAL_REFERENCE_SYSTEM权限&#xff0c;拥有该权限的用户可执行CREATE SPATIAL REFERENCE SYSTEM、CREATE OR REPLACE SPATIAL REFERENCE SYSTEM…

软件模拟I2C案例前提须知——EEPROM芯片之M24C02

引言 了解了I2C的基础知识后&#xff0c;我们将来使用一个I2C案例实践来深入理解I2C通讯&#xff0c;即软件模拟I2C。顾名思义&#xff0c;就是利用软件方式通过模拟I2C协议要求的时序或者说一些相关规定来实现一个I2C通讯协议&#xff0c;然后利用模拟出的I2C协议来实现两个设…

【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(一)

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;贪心算法篇–CSDN博客 文章目录 一.贪心算法1.什么是贪心算法2.贪心算法的特点 二.例题1.柠…

基于STM32的数字多重仪表教学

引言 数字多重仪表是一种可用于测量和显示多种电气参数的设备&#xff0c;广泛应用于实验室、工业和家庭电气工程中。本项目将使用STM32微控制器构建一个简单的数字多重仪表&#xff0c;能够测量电压、电流和功率&#xff0c;并通过LCD显示模块实时显示这些信息。 环境准备 硬…

redis缓存和springboot缓存包冲突怎么办

如果Redis缓存与Spring Boot缓存包发生冲突&#xff0c;可以采取以下几种解决方案&#xff1a; 排除Spring Boot缓存包&#xff1a;在pom.xml文件中排除Spring Boot的缓存依赖&#xff0c;以避免与Redis缓存冲突。例如&#xff1a; <dependency><groupId>org.spr…

ChatGPT 搜索测试整合记忆功能

据 TestingCatalog 报道&#xff0c;OpenAI 正在测试 ChatGPT 搜索的整合记忆功能&#xff0c;被命名为 “Memory in search”2。以下是关于该功能的具体情况123&#xff1a; 功能特点 个性化搜索&#xff1a;启用该功能后&#xff0c;ChatGPT 能利用存储的记忆数据&#xff0…

Graylog采集MySQL慢日志实战

文章目录 前言一、MySQL慢日志0. 慢查询相关语句1. 检查MySQL是否开启慢日志及慢查询保存位置2. 检查慢查询阈值3. 未使用索引是否开启记录慢查询日志4. 查看mysql.slow_log表结构及字段含义5. 慢查询记录两种情况示例 二、graylog采集慢查询日志1. 采集思路2. 创建Sidecar配置…