2

割り当てのために、c ++(winsock 2を使用)で記述されたクライアントアプリケーションとサーバーアプリケーション間で3ウェイストップとハンドシェイクを待機する必要があります。クライアントはSYNを送信します。サーバーはクライアントシーケンス番号をインクリメントし、SYN-ACKを送信します。クライアントはサーバーシーケンス番号をインクリメントし、ACKを送信します。

パケット損失をシミュレートするために、クライアントとサーバーは、パケットを転送しないことがある中間ルータープログラムに接続されているため、損失が発生します。パケット損失の可能性を考慮して、sendto()、select()、recvfrom()ステートメントをどのように構成する必要がありますか?

たとえば、SYNが失われ、クライアントがタイムアウトした場合は、SYNを再送信します。SYN-ACKが失われると、クライアントはタイムアウトしてSYNを再送信します。ACKがなくなったらどうしたらいいのかわかりません。

編集:それは基本的に私のクライアントでは次のようになります:

  • SYNを送信します。
  • select()ステートメントが失敗している間にループし、SYNを再送信します
  • SYN-ACKを受信する
  • ACKを送信する
  • ACKが失われた場合は、ループしてSYN-ACKを再受信する可能性があります。

ループを停止するタイミングを知るにはどうすればよいですか?

4

1 に答える 1

1

selectソケットをブロックせずに読み取ることができるタイミングを確認するために使用できます。

ACKがどの送信パケットに属しているかを確認するには、シーケンス番号を確認します。

タイムアウト内にACKを受信しない場合は、最後のパケットを再送信するだけです。送信したパケットの種類は関係ありません。ACKを受信しない場合は、再送信する必要があります。

于 2012-02-22T06:37:37.203 に答える