1

クライアント ワークステーションの 1 つで奇妙な問題が発生しました。2 つのエンドポイント間でネットワーク経由でデータを交換する単純なアプリケーションがあります。

基本的に、取引は次のように行われます。

  1. クライアント A が着信接続をリッスンする
  2. クライアント B は A に接続し、いくつかのデータを送信します
  3. クライアントAは、さらに処理するためにこのデータを読み取ります

ここで奇妙な点は、クライアント A がデータ全体を受信しないことです (バッファの一部である場合もあれば、空の場合もあります)。

A クライアントは WSAEventSelect 関数を使用し、FD_READ が B から送信されたデータを読み取り、FD_CLOSE が切断を検出するのを待ちます。

通常 (この特定のクライアントを除くたびに) FD_READ が通知され、データが処理され、その後 FD_CLOSE が通知され、すべて問題ありませんが、ここでは代わりに FD_READ が FD_CLOSE を受け取ります。

誰かがこれがどのように可能か教えてもらえますか? もう 1 つのことは、プログラムが約 1 年間正常に動作していたのに、突然クラッシュしたことです。

4

2 に答える 2

0

ここで奇妙な点は、クライアント A がデータ全体を受信しないことです (バッファの一部である場合もあれば、空の場合もあります)。

ブロッキングモードでゼロバイトを受信しないことを除いて、それはTCPの仕組みです。

通常 (この特定のクライアントを除くたびに) FD_READ が通知され、データが処理され、その後 FD_CLOSE が通知され、すべて問題ありませんが、ここでは代わりに FD_READ が FD_CLOSE を受け取ります。

FD_READ は、1 回だけでなく、何回でも通知できることに注意してください。1 回の読み取りでメッセージ全体を受信できる保証はありません。

誰かがこれがどのように可能か教えてもらえますか?

クライアントが接続を閉じました。

于 2013-02-21T23:29:46.417 に答える