当前位置: 首页 > article >正文

Protocol Buffers c# with c++ communcation demo

以下内容完全由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.kler.cn/a/526689.html

相关文章:

  • 从巫师求雨说起
  • Docker容器数据恢复
  • 详解python的修饰符
  • ESP32-S3模组上跑通esp32-camera(39)
  • YOLO11/ultralytics:环境搭建
  • 中间件安全
  • 编程题-三数之和(中等)
  • 20-30 五子棋游戏
  • 【2024年华为OD机试】 (B卷,100分)- 乘坐保密电梯(JavaScriptJava PythonC/C++)
  • 如何用大语言模型做一个Html+CSS+JS的词卡网站
  • WINDOWS安装eiseg遇到的问题和解决方法
  • day1-->day7| 机器学习(吴恩达)学习笔记
  • FLTK - FLTK1.4.1 - 搭建模板,将FLTK自带的实现搬过来做实验
  • 知识管理平台在数字经济时代推动企业智慧决策与知识赋能的路径分析
  • 全面认识了解DeepSeek+利用ollama在本地部署、使用和体验deepseek-r1大模型
  • 【仓颉】仓颉编程语言Windows安装指南 配置环境变量 最简单解决中文乱码问题和其他解决方案大全
  • 360嵌入式开发面试题及参考答案
  • 【Linux指令/信号总结】粘滞位 重定向 系统调用 信号产生 信号处理
  • 【开源免费】基于Vue和SpringBoot的医院资源管理系统(附论文)
  • Python的那些事第六篇:从定义到应用,Python函数的奥秘
  • 将多目标贝叶斯优化与强化学习相结合用于TinyML
  • 2024年数据记录
  • 【16届蓝桥杯寒假刷题营】第1期DAY2
  • 创建 priority_queue - 进阶(内置类型)c++
  • React 低代码项目:项目创建
  • .Net / C# 分析文件编码 并将 各种编码格式 转为 另一个编码格式 ( 比如: GB2312→UTF-8, UTF-8→GB2312)