0

基本的なTCP通信をいくつか行いましたが、いくつか質問があります。トランザクションフローが次のように記述されているTCPサーバーと通信しています。

送信者はSTX(ASCII 0x02)文字を送信してトランザクションを開始し、受信者がACK(ASCII 0x06)文字を送信して応答するのを待ちます。ACKが受信された後、送信者は、メッセージペイロードのサイズを表す4バイトの符号なしビッグエンディアン整数、ペイロード、最後にペイロードの16バイトのMD5メッセージダイジェストを送信します。受信者がメッセージに満足すると、ACK文字を送信します。

<STX> = ASCII 0x02
<ACK> = ASCII 0x06

Sender: <STX>     <0x00><0x00><0x00><0x05><'H'><'E'><'L'><'L'><'O'><0xEB><0x61>...
Recipient:   <ACK>                                                                <ACK>

.Netソケット(System.Net.Sockets.Socket)を使用して、STX / ACK転送制御を管理する適切な方法は何ですか?ソケットはこれを自動的に処理しますか(つまり、単にsocket.Send(byteData)を呼び出しますか)、またはSTXを明示的に送信したり、ACKを待機したりする必要がありますか?

受信についても同じことが言えます。単に着信データを受信するのでしょうか、それともSTX文字をリッスンし、ACKを送信し、ペイロードの準備をする必要があるのでしょうか。

転送制御が自動的に処理される場合、設定する必要のある特定のソケットフラグはありますか?

参考:メッセージフレーミングに役立つことが証明されているリンク(次のような)がいくつか見つかりましたが、STX/ACK転送制御については説明していません。

4

2 に答える 2

2

へへへ、これは以前はシリアル ポート プロトコルでしたが、おそらく変更せずにソケットを使用するように移動しただけでしょう。TCP が実装するようなストリームにはあまり適していませんが、それほど珍しいことではありません。

さて、指示に従ってください。あなたがクライアントであると仮定して、1 バイトを読み取り、それが 0x02 であることを確認します。そうであれば、1 バイトの 0x06 を送り返します。そうでない場合は、0x02 が表示されるまで読み続けてください。あなたは今「接続」されていますが、あなたはすでにそれを知っていました.

次に、パケット長がわかるように 4 バイトを読み取り、残りのパケットを取得するにはバイト数 + 2 を読み取ります。「MD5 ダイジェスト」は無視します。TCP は信頼性が高く、受信したデータの有効性を再確認する必要はありません。1 バイト 0x06 を送り返します。

明確ではない唯一のことは、パケット長の前に 0x02 が必要かどうかです。テキストはそうではないと言っていますが、図はあなたがそうしていると言っています。

于 2011-01-06T22:38:35.523 に答える
2

TCP は、アプリケーション レベルのプロトコルを認識していません。TCP ソケットは単なる双方向バイト ストリームです。STXそれらとACKバイトを明示的に送信/読み取る必要があります。

于 2011-01-06T22:34:30.640 に答える