通过 Socket 从 C++ 到 C# 的 Protobufer

Protobufer from c++ to c# over Socket

我正在尝试将带有协议缓冲区的结构从 c++ 发送到 c#。我收到一个错误。让我向您解释一下我遵循的程序。

C++ 端

1- 我用 2.6.1 协议编译了我的 .proto 文件

message SensorsReport {
required double speed = 1;
required double rpm = 2;}

2 - 我得到了我的 headers,它们是 .h 文件和 .cc 文件。我添加到我的项目并开始填充我的结构。

SensorsReport report;                                      // My message with 2 double
report.set_rpm(info.mEngineRPM);                           // I fill the first one
report.set_speed(speedcalculated);                         // I fill the second one
string buf;                                                // Create a string to put the data in
report.SerializeToString(&buf);                            // Serialize data
send(tcp_socket, buf.data(), (int)strlen(buf.data()), 0);  // Send sentece

C#侧

1- 我将 protobuf-net dll 添加到我的项目中,并使用消息 .

创建了我的 class
using System;
using ProtoBuf;


[ProtoContract]
public class SensorsReport
{
    [ProtoMember(1)]
    double speed { get; set; }
    [ProtoMember(2)]
    double rpm { get; set; }
}

2- 我创建了一个 NetworkStream 来获取流并反序列化。

NetworkStream stream = tcpClient.GetStream();
SensorsReport newdata = Serializer.Deserialize<SensorsReport>(stream);

这是我的所有程序,我收到下一个错误:无效 wire-type 我读过这与创建消息的方式有关,但我认为我做对了一切。我没有吗?

strlen 不应用于确定缓冲区的长度

send(tcp_socket, buf.data(), (int)strlen(buf.data()), 0);

在二进制数据的情况下。 buf.length() 可能效果更好。

我发现了问题。不是固定接收缓冲区的长度。您必须将缓冲区设置为与发送消息相同。例如,如果您的消息长度为 32 字节,则您的缓冲区将为:

byte[] data = new byte[32];
recv = newsock.ReceiveFrom(data, ref Remote);

现在的问题是我不知道我的消息要多长...无论如何我找到了原因。