背景:CreateIoCompletionPort、WSASend/Recv、およびGetQueuedCompletionStatusを使用して、サーバー上で重複したソケットioを実行しています。フロー制御では、クライアントに送信するときに、保留中のすべてのOVERLAPがIOCPからポップしたときにのみ、いくつかのWSASend()を呼び出すことができます。WSASendを使用している一部のオーバーラップが、GetQueuedCompletionStatusを使用してタイムリーに返されませんか?
問題:最近、OVERLAPがIOCPに返されない場合があります。 GetQueuedCompletionStatusを呼び出すスレッドはそれらを取得せず、ローカルの保留中のキューに残ります。クライアントがソケットからデータを受信し、ソケットが接続されていることを確認しました。 WSASend()呼び出しが行われたときにエラーは返されませんでした。重複するが、単純に次のような外部刺激せずに戻って来ない「決して」:
- クライアントまたはサーバからのソケットを切断、すぐに)GetQueuedCompletionStatusスレッドがのWSASend(への追加の呼び出しを作る重なっ
- を取得することができます場合によっては、いくつかのOVERLAPが突然キューから飛び出す前に、いくつかが必要になることがあります。
質問:このタイプの動作を見た人はいますか?これを引き起こしていることに関するアイデアはありますか?
おかげで、 ジェフリー
あなたのアプリはシングルまたはマルチスレッドですか? – zdan
マルチスレッドです。 1つのスレッドはループし、GetQueuedCompletionStatusを呼び出し、OVERLAPをリサイクルします。また、別のスレッドはWaitForSingleObject(短いタイムアウト100ms)を使用し、イベントが設定されていればWSASend()を呼び出します。 –