私はProtobufsに関して大きな問題があります。Googles ProtoBuf on C++でProtobuf-netとチャット(UDP)
私は、Googles Protobufを使用してC++でサーバー/クライアントアプリケーションを使用しています。 非常にうまく動作します。
クライアントは、このメッセージ を他のクライアントに配布する必要があるサーバーにデータを送信します。
C++クライアントは、Protobuf-Structを固定サイズ(500気圧)のChar-Arrayにパックする純粋な送信者です。
C++サーバはそれをデシリアライズし、コマンド(ログインログアウトまたは他のユーザへのメッセージ)と(メッセージの場合)C#-Clientに送信します。 これは固定サイズの500文字でも行われます。
これは非常にうまくいきます。 C#側にあります。
C#クライアントatmはProtobuf-netでログインしてメッセージを送信できます。これはProtobuf-Netがダイナミックサイズのバイト配列(これはC++のSideのchar配列とは違って符号なし)にパックしていても非常に鮮明です。 それでも、サーバーはメッセージを認識して印刷します。
サーバがC++クライアントからメッセージを転送するとき(ただし、ここで問題が起きます)、C#で大きな問題が発生します。
注:クライアントはUnity3Dで実装されています。
Unityは、ほとんどの場合、バイト配列を受け取ります。 Byte-Arrayは、サーバーから送信されたメッセージとは異なり、署名されていません。これはにつながる-1 255
C#-codeになる:これはC#のクライアントである
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++ - コード:
char buffer[BUF];
package.serializeToArray(buffer,500);
int n = sendto(sock,buffer,BUF,0,(struct sockaddr*)
&serverAddr,sizeof(serverAddr));
これはC++である - クライアント
C++ - ServerはちょうどUDP-と同じである、C#の-clientにチャーアレイを転送 serialize-partのないクライアント。 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-File を作成し、そこからBuild libaryをProtoBuf.dllを参照して作成します をプリコンパイラで作成し、Unity3Dに含めるSerialize.dllを作成させます。
実際にあなたの質問は何ですか? –
が更新されました。質問は:なぜ私はこれらのエラーを取得するのですか?なぜそれは動作しません? :/ –