プログラムは(C ++)閉じた後ソケットが開いたまま
質問
私は私のアプリ閉じたときに(またはそれ以上、プレスの日食のボタンを終了する)ことを、私は現在、小規模なサーバーアプリケーションを書いている、と私の問題があり、ソケットは時々開いたままになりますので、私は私のアプリの次を実行したとき時間は、バインド()「は既に使用されているアドレス」で失敗します。プログラムが終了したときにどのように私はきちんと自分のソケットを閉じることができますか?私はすでに置く
close(mySocket);
クラスのデストラクタで、それは何も変更していないようです。
解決
http://hea-www.harvard.edu/~fine /Tech/addrinuse.html には、あなたの質問の多くに答える必要があります。私はその問題を回避するためにSO_REUSEADDRを使用する傾向にあります。
他のヒント
あなたのエンドポイントがでている状態かを把握するためにnetstat
を使用してください。私の推測では、それがTIME_WAIT
と完全に閉じていないのいずれかであるということです。これは、TCPの正しい動作であり、まだ到着し、問題を起こさないために、エーテルに出かもしれない浮遊セグメントを許可するように存在しています。 TIME_WAIT
の持続時間は、このように再送されますもセグメントが適切に処理されることを保証する、2 * MSL、ネットワーク上のセグメントの即ち二倍最大寿命のようなものである。
、SO_REUSEADDR
は限り反対側のエンドポイントが毎回異なっているとしてあなたの友達です。これは一般的なケースだが、時には人々が特定のポートにバインドのような奇妙なことに、クライアントの操作を行い、その場合には、あなたがまだEADDRINUSE
になってしまいますB / C TCPは、の両方のエンドポイントとしてセッションを定義しますます。
あなたはSO_REUSEADDR
オプションを設定することがありますか?あなたが言っているから、それはないようです。
近くの戻り値をチェックすることを忘れないでください。ソケットが正常に閉じているときには0を返します。それは-1を返します、それが失敗した場合。
あなたのアプリは何とかまだバックグラウンドで実行されていないか?