4

これは、Linux カーネル 2.6 の TCP ソケットに関するものです。

一度に 8 MB を受信する別のクライアントにノンブロッキング送信を使用して、300 MB などの大量のデータを送信しています。

8 MB を 1 回受信すると、「受信側」は受信を停止します。これは、エラー処理などの他のタスクを実行する必要があるためです。送信者は EWOULDBLOCK を受け取りますが、これは非同期通信であるため、送信側は相手側の TCP recv バッファーをいっぱいにしようとします。

私の質問は次のとおりです。「送信者」が EWOULDBLOCK を取得し、「受信者」が受信を停止しても、TCP recv バッファーにデータが残っていますか? 同じソケットがエラー処理に使用されるため、「レシーバー」は既存のソケットを再利用する前に TCP recv バッファーをクリアする必要がありますか?

4

2 に答える 2

5

はい。EWOULDBLOCKを取得したときに、既に送信した一部のデータがまだ受信側のアプリケーションによって読み取られていない可能性は十分にあります (実際には可能性が高いです) 。このバッファリングされたデータはread、ソケットの次のデータで利用できます。

これは、受信者が「おっと、これ以上送信しないでください」というメッセージを送信者に送り返した場合、送信者はそのメッセージに対処できず、データを「送信解除」できないことを意味します。write()/に渡されるsend()と、その途中であり、呼び出すことはできません。

受信者は、不要になったデータを読み取って破棄することで、この不測の事態に対処する必要があります。つまり、データ ストリームに何らかのトランザクション区切り文字が必要になります。

于 2009-09-08T02:04:54.957 に答える
0

私の質問は次のとおりです。「送信者」が EWOULDBLOCK を取得し、「受信者」が受信を停止しても、TCP recv バッファーにデータが残っていますか?

送信側が EWOULDBLOCK を取得したため、TCP 受信バッファにデータがあります。それが発生する唯一の条件です。

あなたの質問は意味がありません。

于 2016-04-28T11:37:49.873 に答える