0

サーバークライアントアプリケーションがあります。サーバーは C++ で、クライアントは C# です。クライアントが Windows にある間に、サーバーが Linux インスタンスで実行されている可能性があります。したがって、アーキテクチャ、したがってエンディアンについての仮定を立てることはできません。protobuf を使用してデータ構造をやり取りしています。現在、大きなデータ構造である次のメッセージのサイズを含むヘッダーとしてメッセージを送信する戦略を採用しています。次のようになります。

message message_size {
    required fixed64  size = 1;
}

protobuf が両端で送信するバイト数を知る方法はありますか?これは、上記の構造がシリアル化されるバイト数です。

4

1 に答える 1

1

ここでの最終的な問題は、ルート protobuf メッセージにプレフィックスの長さが付けられていないことです (設計上)。オープン ストリームを介して複数のメッセージを処理するための明確に合意された API はないため、基本的には、エンコードして処理する任意の長さのプレフィックスが機能します。一般的なパターンは、protobuf ルールとダミーのフィールド番号を使用して処理することです。protobuf-net の場合、それが何SerializeWithLengthPrefixをするかDeserializeWithLengthPrefixです。ただし、C++ からは簡単に利用できない場合があります。固定幅/エンディアン規則を使用して長さを手動でエンコードし、その直後に生のペイロードをダンプする方が簡単な場合があります。

于 2018-05-15T23:01:04.930 に答える