2012-05-20 7 views
7

私は、クライアントアプリケーションを持っています。このアプリケーションは、サーバとの通信にアンマネージドDLLを使用しています。FIN_WAIT_2状態のソケットを閉じる(kill、release?)方法は?

すべてのネットワーク関連の操作は、アンマネージドdllの内部で行われます。 サーバーで多数の操作を行った後、クライアントはTCPポートを使い果たしています。 我々は「netstatの-an」を使用してnetwotkの状態をチェックすると、私たちは次のような結果を得る:クライアントが閉じられた後

... 
TCP 192.168.11.55:56048 192.168.10.28:5000  FIN_WAIT_2 
TCP 192.168.11.55:56049 192.168.10.28:5000  FIN_WAIT_2 
TCP 192.168.11.55:56050 192.168.10.28:5000  FIN_WAIT_2 
TCP 192.168.11.55:56051 192.168.10.27:5000  FIN_WAIT_2 
TCP 192.168.11.55:56052 192.168.10.28:5000  FIN_WAIT_2 
TCP 192.168.11.55:56053 192.168.10.27:5000  FIN_WAIT_2 
TCP 192.168.11.55:56054 192.168.10.27:5000  FIN_WAIT_2 
TCP 192.168.11.55:56055 192.168.10.27:5000  FIN_WAIT_2 
TCP 192.168.11.55:56056 192.168.10.27:5000  FIN_WAIT_2 
TCP 192.168.11.55:56057 192.168.10.28:5000  FIN_WAIT_2 
TCP 192.168.11.55:56058 192.168.10.27:5000  FIN_WAIT_2 
TCP 192.168.11.55:56059 192.168.10.28:5000  FIN_WAIT_2 
TCP 192.168.11.55:56060 192.168.10.27:5000  FIN_WAIT_2 
... 

ポートのみが解放されます。

VSプロジェクトをデバッグモードで実行すると、ポートが不足することはありません。 しかし、リリースモードで実行中に、それが起こっています。

また、私はサーバーやクライアントのどちらのソースにもアクセスできません。

FIN_WAIT_2状態にあるポートを解放または強制終了する方法はありますか。

答えて

7

ソケットがFIN_WAIT_2にある場合、ローカルソケットは閉じられ、リモートソケットがクローズ要求を送信するのを待機しています。このクローズ要求が決して到着しない場合、ソケットはしばらくの間FIN_WAIT_2状態のままです。

この理由は、リモートパーティからのクローズ要求が遅延し、別のアプリケーションがソケットを再利用した後に到着した場合、その新しい接続がすぐにクローズされるためです。

必要に応じてタイムアウトを変更できますが、最後に管理されていないDLLがTCPシャットダウンシーケンスを完全に実装していません。詳細については、shutdown /クライアントソケットを閉じたとき

http://answers.microsoft.com/en-us/windows/forum/windows_7-networking/how-to-close-finwait2-connections-except-reboot/ba2fed9f-8b61-4b71-ab5b-d39dc9a387e3

+0

タイムアウトを最小値に設定すると助けになりましたが、あまり効果はありませんでした。最後に、クライアント側でTCP_NODELAYパラメータを設定することで問題を解決することができました。ありがとうございました。 – ulughbekula

+0

Mac OS Xについてはどうですか? –

1

サーバー側のソケットが0 bytesを読み込みます参照してください。
この時点で、サーバーソケットをシャットダウン/閉じる必要があります。あなたの接続はTIME_WAITPID0と表示され、最終的に遠ざかります。

私はそれが得られるほど良いと思います。

関連する問題