對於這兩種Protobufs我都有一個很大的問題。在C++上使用Protobuf-net與C#(UDP)聊天的Googles ProtoBuf
我在C++上使用Google的Protobuf服務器/客戶端應用程序。 它工作得很好。
客戶端將數據發送到服務器,該服務器應將此消息 分發給其他客戶端。
C++客戶端是一個純粹的發送者,將Protobuf-Struct封裝在固定大小(500個大氣壓)的Char數組中。
C++ Server將其反序列化,查找命令(登錄註銷或其他消息)以及(如果其消息)將其發送給C#-Client。 這也是由500個字符的固定大小完成的。
這工作得很好。 現在在C#端:
C#客戶端atm可以登錄並使用Protobuf-net發送消息。即使Protobuf-Net將其打包爲一個字節數組(與C++中的char數組不同的是,它與C++中的char數組不同,它的大小也是一樣)。 即使如此,服務器也會識別該消息並將其打印出來。
但是(這裏是令人毛骨悚然的問題),當服務器轉發來自c + +的消息 - 客戶端我在C#中遇到很大的問題。
注意:客戶端在Unity3D中實現。
Unity收到Byte-Array幾乎沒問題。 需要注意的一點是,字節數組是無符號的,與服務器發送的消息不同。這導致-1成爲255
C#-Code:
sock.ReceiveFrom (incoming, ref otherEnd);
SendPack message;
using(System.IO.MemoryStream ms =
new System.IO.MemoryStream(incoming)){
message = ProtoBuf.Serializer.Deserialize<SendPack>(ms);
print (message);
ms.Flush();
ms.Close();
}
這是C#的客戶端。
C++ - 代碼:
char buffer[BUF];
package.serializeToArray(buffer,500);
int n = sendto(sock,buffer,BUF,0,(struct sockaddr*)
&serverAddr,sizeof(serverAddr));
這是C++ - 客戶端
的C++ - 服務器只轉發該炭數組到C#-client, 是一樣的UDP-沒有序列化部分的客戶端。
我得到的錯誤,如: ProtoException:在源數據 無效的字段:0
或Invalide線型
編輯: 這是原癌文件
syntax = "proto2"; package Messages;
message SendPack {
required int32 command = 1;
required string name = 2;
repeated RobotPart content = 3;
}
message RobotPart {
required float yaw = 1;
required float pitch = 2;
required float roll = 3;
}
對於C++我使用正常的原始編譯器 對於C#我使用-Net編譯器來創建CS文件 然後從它構建庫文件,參考ProtoBuf.dll爲了統一 ,然後讓預編譯器將Serialize.dll包含在Unity3D中
實際上你的問題是什麼? –
已更新。問題是:爲什麼我得到這些錯誤。爲什麼不行? :/ –