質問

私は私のアプリ閉じたときに(またはそれ以上、プレスの日食のボタンを終了する)ことを、私は現在、小規模なサーバーアプリケーションを書いている、と私の問題があり、ソケットは時々開いたままになりますので、私は私のアプリの次を実行したとき時間は、バインド()「は既に使用されているアドレス」で失敗します。プログラムが終了したときにどのように私はきちんと自分のソケットを閉じることができますか?私はすでに置く

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を返します、それが失敗した場合。

あなたのアプリは何とかまだバックグラウンドで実行されていないか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top