2012-01-26 2 views
1

を呼び出します。しかし、現在、closesocket()の呼び出しが成功した後でも、リスナーがLISTENING状態に留まるという問題があります。 TIME_WAITを入力しないため、ソケットが再作成されたときに同じリスナーが同じポートに作成されます。クライアントは新しいリスナーに接続できません(おそらく)。 SO_LINGERは0秒に設定されます。ソケットが閉じられているときには保留中の送信はありません。最も古いソケットは、別の状態に目立つことなく約10秒後に閉じるように見えます。 closesocketの呼び出しが成功した(後LISTENING状態でリスナーを保つことができる何WinsockのTCPリスナーが成功したclosesocket後の状態をLISTENINGのままです()私はTCPリスニングソケットが作成され、すぐに障害が発生した場合にSO_REUSEADDRを使用して、同じソケットに再バインドするように設定されている既存のDLLに取り組んでいます

)?

+0

私はあなたが「同じアドレスに再バインド」を意味し、それを取ります。答えは、closesocket()の呼び出しが成功した後にリスニング状態に留まるべきではないということです。パラメータを調べて慎重に値を返すことで、あなたが思っているソケットを閉じていることを確認することをお勧めします。デバッガはあなたの友人です。 – Ben

+0

はい、同じアドレスに再バインドします。デバッグでは、正しいソケットハンドルがclosesocket()に渡されており、ソケットハンドル上のデータブレークポイントはclosesocket()呼び出しの前にトリガされません。ソケットは決して複製されません。 ProcExpで示されたプロセス(最初は実行時に2つ重複する)のリスナーの数に関係なく、closesocket()の有効な呼び出しの後にTIME_WAIT状態にはなりません。 –

答えて

1
  1. あなたは間違ったソケットを閉じました。
  2. ハンドルを複製して複製を閉じるのを忘れました。
  3. 他の誰かがポートをつぶしました。
  4. あなたの失敗コードは、何かが失敗したときにリスナーの失敗を検出します。
  5. リスナーは、失敗しなかった場合に障害を報告しています。
  6. あなたの失敗モードは状態を破壊し、closesocket()は何かを閉じます。
+0

1)クローズが正しいソケットハンドルにあることが検証されます。 2)ハンドルはどこにも複製されません。単に変数に格納されます。 3)ポートはこのプログラムによってのみ使用されることが検証されています.4)これを調査する必要があります。 4-7私は閉鎖をせずに調査しており、引き続きこれらを検討します。 –

+0

私はクローズアップを忘れてしまったという非常に古い質問です。実際には、ソケットハンドルは、ハンドル継承が有効になっているCreateProcess()呼び出しで重複していました。ソケットハンドルは継承できないものとして設定されていましたが、これはWinSockハンドルには影響しません。 –

関連する問題