2016-05-27 2 views
0

Я пытаюсь отправить структурированный документ с буферами протокола из C++ в C#. Я получаю сообщение об ошибке. Позвольте мне объяснить вам процедуру, которой я следовал.Protobufer от C++ до C# over Socket

C++ Side

1- я составил свой файл .proto с 2.6.1 protoc

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

2 - я получил заголовки, которые являются .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# Side

1- Я добавил к моему проекту DLL Protobuf-сеть, и я создаю мой класс с сообщением.

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); 

Это моя процедура, и я получаю следующую ошибку: Invalid провода типа я прочитал, что это что-то с Сопутствующим способом создания сообщения, но я думаю, что я все правильно. Не так ли?

+0

Нет, если что-то не работает, все не так! – Vtik

ответ

0

У меня возникла проблема. Не следует фиксировать длину принятого буфера. Вы должны установить yor buffer так же, как и сообщение отправки. Например, если ваше сообщение длиной 32 байта, ваш буфер будет:

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

Проблема теперь я не знаю, как длина будет мое сообщение ... в любом случае я узнал причину.

0

strlen не должны быть использованы для определения длины буфера

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

в случае двоичных данных. buf.length() может работать лучше.

+0

Не работает с buf.length(). Я не знаю, где ошибка .... – Javi

+0

«IsRequired = true» в '[ProtoMember (1, IsRequired = true)]' и '[ProtoMember (2, IsRequired = true)]' имеет значение? –

+0

Не работает с isRequired = true ... не знаю, как это исправить ... – Javi