2012-04-05 8 views
3

この呼び出しは非常に短時間で返されますが、一部のマシンでは1秒に非常に近い時間がかかります。誰もこの問題を見たことがありますか?ループバックアドレスを使用しているので、ネットワークが画像から外れるはずです。WinSock closesocket()呼び出しは一部のコンピュータでは1秒かかります

+1

おそらく、アンチウイルス/ファイアウォールソフトウェアが干渉していますか? –

+0

遅延を追加するだけのウイルス対策ソフトウェアやファイアウォールソフトウェアはあまり役に立ちません。私はファイアウォールをオフにし、ウイルスチェッカーのために常駐シールドを実行していません。同じ振る舞い。 –

+0

一部のAVおよびセキュリティ製品では、バグのある動作が発生する傾向があります。もしあなたが他についていないのであれば、それらをすべてアンインストールする価値があるかもしれません。 - 再確認する。 –

答えて

0

問題はおそらく、ウィンドウソケットの実装のどこかにあります。 OSの観点から、closesocket(またはCloseHandle)を呼び出して、ドライバの「デバイス」オブジェクトを解放することに相当します。ほとんどのドライバーはこの要求を即座に(同期的に)処理し、必要に応じて未解決のI/Oをすべて中止します。しかし、何かが完了するまで、「愚かな」運転手があなたをブロックすることがあります。私がやるだろ何

  • は(タスクマネージャで)あなたのプログラムを終了してください。それを終了するのに時間がかかりますか? (もしそうなら、それは運転手によってロックされているようだ)。
  • ストリームソケット(TCPなど)について話している場合は、SO_DONTLINGERオプションを使用してみてください。つまり、保留中のすべてのデータがピアに送信されるまで待機しないように指定します。
+0

他の遅延があるので、タスクマネージャを使用してプロセスを終了するのに1秒かかるかどうかは分かりにくいです。 SO_DONTLINGERは、ソケットを介して送信されているデータがないため、この特定のケースでは何の効果もありません。 SO_DONTLINGERは、すべてのデータが送信されるまで待機するためのものです。 –

+0

@Jesse Pepper:未送信のデータを送信することとは別に、TCPでは 'FIN'パケットを含むいくつかのピンポンを含む接続を正常に終了する「式」があります。私には分かりませんが、おそらく 'SO_DONTLINGER'にもこれが含まれています。私。このフラグを指定すると、 'RST'との接続を中止します。 – valdo

関連する問題