2009-08-26 9 views
2

ユーザーデータとメッセージの終了を区別できるように、メッセージプロトコルをどのように設計する必要がありますか。メッセージングプロトコル

たとえば、TCP/IP経由でクライアントに送信するために、クライアント側からメッセージの長さを知る必要があるように、クライアントからの入力を受け取ります。メッセージの終わりに達しましたか?

どのようにC++でこれを行うのですか?私はWindowsソケットを使用しています

答えて

3

アプリケーション固有のプロトコルでは、メッセージの長さをメッセージの前にエンコードするために、終端を使用するのではなく、合理的な方法があります。したがって、最初の数バイト(変化する数)はメッセージの長さを指定し、特別なコード(通常はすべてのビットがオンまたはすべてオフ)は、継続が必要な長いメッセージを指定します。

編集:例が要求されました。メッセージの最大サイズが255バイトになるようにプロトコルを設計し、文字列 "hi"を送信したいとしましょう。私たちのプロトコルメッセージは、2,104,105の3バイトで構成されます。最初のバイト、2は、それに続くメッセージの長さを示します。 2番目と3番目のバイト、104105は、hiのASCIIです。

+0

どうすればよいですか?例がないと分かりにくいので、例を挙げてください:) – akif

+0

は私のためにそれを行うように見えます – ThePosey

+1

- 今では必要ない場合でも255より長いメッセージのスキームを忘れないでください(またはこれまで)少なくともこれを後で加えることを困難にするメッセージをデザインしていない。 - 嘘のメッセージから保護することも忘れないでください。たとえば、長さ10のメッセージを送信しますが、送信するのは5だけです。ロックアップ(悪い)ですか?これを検出できますか?接続を切断しますか?回復を試みる? - あなたのバッファを見てください!それらをオーバランしないでください! (古典的なセキュリティの欠陥) – Aardvark

0

メッセージをチャンクで送信し、各チャンクの長さを前に付けることができます。ストリームは長さゼロのチャンクで終了します。 (これは、ストリームの長さが事前に分からない場合にHTTPが行う方法です。)

1

最初に長さを送信してからメッセージを送信できます。

+0

どのように?あなたは例を挙げることができますか? – akif

+0

送信側は、メッセージペイロードのバイト数をワイヤに書き込み、次にメッセージペイロードに書き込みます。受信側はバイト数を読み取り、ペイロードの長さを認識してペイロードを読み取ります。 – sharptooth

0

特別なマーカーを使用してメッセージの終わりを判断するコンピュータシステムが数多くあります.cは文字配列で\ 0を使用し、JPEGはマーカーとして0xFFを使用します。

これらのシステムはすべて、メッセージのプレフィックス長をはるかに単純で堅牢にするという結論に至りました。

実際にはTCP自体です。 2バイトのユーザー入力をソケットに書き込むと、もう一方の端で2バイトが使用可能になり、システムによって処理されるTCPパケットは、各パケットをペイロード長でマークするため、これを認識します。

入力の送信が完了したら、片側からソケットをshutdownに送信し、もう一方の側から通知を受け取ります(通知が有効になっている場合)。

+0

メッセージにプレフィックスを付けるにはどうすればいいですか?長さが初めて完全に送信されない場合はどうなりますか? – akif

+0

完全なメッセージが読み取られるまで、常に読み続ける。だからまずxバイト(lenghth)まで読むことを続け、長さに応じてすべてのバイトが受信されるまで読書を続けます。 – stefaanv

+0

xバイトを読み取る方法を知るには – akif

0

POPの例に従えば、 "。"空の行の始めに。