3

セットアップは次のとおりです。

サーバークライアント
 | |
接続を受け入れる
 | |
 v |
msg1->を送信|
 | |
 vv
recv<-送信
 | |
 vv
msg2->recvを送信します
 | |
 vv
               選ぶ

これが私の質問です:
1。クライアントは、閉じる前に実際にmsg1を受信しますが、なぜこのようになっているのですか?
2.msg2を送信すると正常に戻ります。msg1を受信した後にクライアントが閉じるのに、なぜmsg2の送信が成功するのですか?

PS私はTCP用のストリームソケットを使用しています。

4

2 に答える 2

5
  1. このrecv関数は、受信バッファ内の次のものを取得します。クライアントの場合、ソケットがデータグラム ソケットの場合、次はmsg1です。ストリーム ソケットの場合、メッセージ境界は維持されないため、msg2が到着し、recv バッファーに両方の空きがある場合、recv はmsg1msg2の両方からのデータを含めることができます。

  2. sendメッセージの反対側を待たずrecv、送信キューに追加するだけです。その時点では、クライアントが接続を読み取る前に閉じるかどうかはわかりません。メッセージを確認するためにクライアントに応答を送信させる必要があることを知る必要がある場合。

于 2010-04-06T14:26:47.247 に答える
4

接続がセットアップされると、OS はシステムに出入りするパケットを管理し、recv() 呼び出しはパケット バッファーを読み取るだけで、send() 呼び出しはパケットをキューに入れるだけです。

于 2010-04-06T16:10:09.537 に答える