2009-08-06 1 views
5

私は現在、小さなサーバーアプリケーションを作成していますが、私のアプリケーションを閉じる(またはEclipseの終了ボタンを押すと)オープンするので、次回に自分のアプリケーションを実行すると、bind()は "Address already in use"で失敗します。プログラムが終了したら、どうすれば私のソケットを適切に閉じることができますか?私はすでに置いたプログラムが終了してもソケットが開いたままになっています(C++)

close(mySocket); 

しかし、それは何も変更されていないようです。

+0

デストラクタが実行されていますか?表示するためにいくつかの出力またはブレークポイントを置くことができますか? –

+0

TCPは「有線で」標準化されていますが、APIレベルでは標準化されていません。したがって、TCPに関する質問をする際に最も重要なことの1つは、プラットフォームを公開することです。 –

答えて

2

http://hea-www.harvard.edu/~fine/Tech/addrinuse.htmlは、多くのご質問にお答えします。私はその問題を回避するためにSO_REUSEADDRを使う傾向があります。

+0

私が正しいとすれば、この種のことはソケットが使用中であるとまだ報告されていないことを無視します。しかし、最初に適切に閉じられる方法はありますか? – fresskoma

+0

はい。その上で 'close'を呼び出します。 – Geo

+0

はい、ただし、どこに。どこで私のアプリが終了したときにそれを実行させるためにそれを呼び出す必要があります。 – fresskoma

-1

アプリが何らかの形でバックグラウンドで実行されていないことは確かですか?

+0

ねえ、かなり。 kill -9は間違いなくそれをシャットダウンしなければならないでしょうか?とにかく、ps -Aをgrepすると、それを見つけることができません。 – fresskoma

+0

Kill -9はそれを処理する必要があります。それは驚くべきことです。 – Juan

+0

「kill -9」は、「これを今すぐ中止する」という意味ではなく、「このことを正しく黙らせてください」という意味ではありません。デストラクタを呼び出さない。 –

2

あなたがSO_REUSEADDRオプションを設定することがありますか?あなたが言っていることから、そうではないようです。

3

netstatを使用して、エンドポイントの状態を把握してください。TIME_WAITにあり、完全に閉じていないと思います。これはTCPの正しい動作であり、まだエーテルに入っていても問題にならない迷子セグメントが到着する可能性があります。 TIME_WAITの持続時間は、2 * MSL、すなわちネットワーク上のセグメントの最大有効期間の2倍のようなものであり、したがって、再送信されるセグメントさえも適切に処理されることを保証する。

他者が指摘しているように、相手側のエンドポイントが毎回異なる限り、SO_REUSEADDRはあなたの友人です。これは一般的なケースですが、クライアントを特定のポートにバインドするような奇妙なことが起こることがあります。その場合は、EADDRINUSE b/c TCPで終わります。の両方のセッションを定義します。

0

閉じるの戻り値を確認することを忘れないでください。ソケットが正常に閉じられると0を返します。失敗した場合は-1を返します。

関連する問題