0

プロジェクトの一環として、データグラムパケットのソケットを使用して構造を送信する方法を決定する必要があります。そのために、サードパーティのライブラリを介したシリアル化を使用することは想定されていません。私が思いついたのは、構造体フィールドをバッファーにエンコードすることです。

例えば。

struct message {
   int sequence_number;
   string datamessage;
}

この構造を送信するには、これを次のようなバッファにエンコードします。

/ s "sizeofmessage" / i "sequence_number" / data "datamessage"

これを達成するためのより良い方法はありますか?

4

1 に答える 1

0

受信側がを再構築するのに十分な情報がフォーマットに含まれている限り、データを任意の方法でシリアル化できますstruct message

提案された形式が明確ではありません。

/s"sizeofmessage"/i"sequence_number"/data"datamessage"

これらの引用符がメッセージに文字通り存在することを意味するのかどうかはわかりません。また、メッセージのサイズとシーケンス番号をASCIIの10進文字列としてエンコードする必要があるのか​​、それとも他の何かとしてエンコードする必要があるのか​​わかりません。 。

将来さらにフィールドが追加される場合に備えて、受信者が新しいメッセージ形式を認識できるようにプロトコルを拡張可能にする必要があるかどうかを判断する必要があります。上で示した非常に単純な構造のみを処理するものをハードコーディングするか、別の構造を処理する可能性のあるより柔軟なものが必要かを決定する必要があります。シリアル化フォーマットを拡張可能かつ柔軟にすると、既製のシリアル化ライブラリを使用しないという決定を変更したくなる可能性があることに注意してください。

しかし、それを非常に単純に保ち、この特定の構造のみを処理するものを設計したいとします。

これがあなたの場合に機能する非常に単純なものです:

  • シーケンス番号を送信します。例えば:
    • ネットワークバイトオーダーの4バイト整数(ビッグエンディアン)。
    • ASCIIで送信される数字を含む10進数として、' '(スペース)などの選択した数字以外の文字で終了します
    • (または明確にデコード可能なその他のもの)
  • 文字列をバイトシーケンスとして送信します。

UDP(データグラムソケット)を使用しているため、文字列の長さを送信したり、特殊文字で終了したりする必要はありません。受信者は、シーケンス番号がデコードされた後のパケットの残りのすべてのバイトが文字列を構成していることを認識します。

これは、メッセージがそれぞれ1つのUDPパケットに収まる限り(つまり、約64KB以下)機能します。

于 2012-04-09T22:22:29.667 に答える