ユーザー データとメッセージの終了を区別できるように、メッセージ プロトコルをどのように設計すればよいでしょうか。
たとえば、ユーザーからの入力を受け取り、それを TCP/IP 経由でクライアントに送信します。クライアント側はメッセージの長さを知る必要があります。クライアントがメッセージの終わりを認識する何らかの種類の終了を使用すると考えたものです。達した?
C ++でこのようなことをするにはどうすればよいですか。Windows ソケットを使用しています
アプリケーション固有のプロトコルのかなり一般的な戦略は、終了を使用する代わりに、メッセージの前にメッセージの長さをエンコードすることです。したがって、最初の数バイト (変化する数) はメッセージの長さを指定し、いくつかの特別なコード (通常はすべてのビットがオンまたはすべてのビットがオフ) は、継続が必要な長すぎるメッセージを指定します。
編集:例が要求されました。メッセージの最大サイズが 255 バイトになるようにプロトコルを設計し、文字列 "hi" を送信したいとします。プロトコル メッセージは、 、 、 の 3 バイトで構成さ2
れ104
ます105
。最初のバイト は2
、それに続くメッセージの長さを示しています。2 番目と 3 番目のバイト と は、と104
の105
ASCII です。h
i
最初に長さを送信し、次にメッセージを送信できます。
メッセージの終わりを決定するために特別なマーカーを使用する多くのコンピュータシステムがあります-cは文字配列で\0を使用し、JPEGはマーカーとして0xFFを使用します。
これらのシステムはすべて、メッセージの前に長さを付ける方がはるかに簡単で堅牢であるという結論に至ります。
TCP自体が実際にこれを行います。2バイトのユーザー入力をソケットに書き込むと、もう一方の端で2バイトが使用可能になり、システムによって処理されるTCPパケットは、各パケットにペイロード長をマークするため、これを認識します。
入力の送信が完了したら、一方の側からソケットをシャットダウンすると、もう一方の側に通知されます(そのような通知が有効になっている場合)。
または、POPの例に従って、「。」を使用することもできます。空の行の先頭。
メッセージをチャンクで送信し、各チャンクにその長さを追加できます。ストリームは長さゼロのチャンクで終了します。(これは、ストリームの長さが事前にわからない場合に HTTP が行う方法です。)