79

以下のポートにソケットをバインドしようとしています:

if( bind(socket_desc,(struct sockaddr *) &server, sizeof(server)) < 0)
{
    perror("bind failed. Error");
    return 1;
}
puts("bind done");

しかし、それは次のようになります。

$ ./serve   
Socket created    
bind failed. Error: Address already in use

このエラーが発生するのはなぜですか?

4

9 に答える 9

87

誰もが正しいです。ただし、コードのテストにも忙しい場合、ソケットの起動と停止が比較的速い場合は、独自のアプリケーションがソケットを「所有」している可能性があります。ソケットオプションとしてSO_REUSEADDRを試してください。

SO_REUSEADDRは正確に何をしますか?

このソケットオプションは、このポートがビジー状態(TIME_WAIT状態)であっても、先に進んでそれを再利用することをカーネルに通知します。ビジーであるが別の状態の場合でも、すでに使用中のアドレスエラーが発生します。サーバーがシャットダウンされ、ソケットがポートでアクティブな状態ですぐに再起動された場合に便利です。予期しないデータが入ってくると、サーバーが混乱する可能性があることに注意してください。ただし、これは可能ですが、起こりそうにありません。

「ソケットは5タプル(プロト、ローカルアドレス、ローカルポート、リモートアドレス、リモートポート)です。SO_REUSEADDRは、ローカルアドレスを再利用できると言っているだけです。5タプルは一意である必要があります!」Michael Hunter(mphunter@qnx.com)による。これは真実であり、これが予期しないデータがサーバーに表示される可能性が非常に低い理由です。危険なのは、そのような5つのタプルがまだネット上に浮かんでいて、バウンドしている間に、同じシステム上の同じクライアントからの新しい接続がたまたま同じリモートポートを取得することです。これは、「2.7TIME_WAITの状態を説明してください」のRichardStevensによって説明されています。

于 2013-03-04T10:09:10.130 に答える
53

すでにそのポートを使用しているプロセスがあります。netstat -tulpn特定のポートを使用しているプロセスIDを見つけることができます。

于 2013-03-04T10:03:12.007 に答える
48

エラーは通常、開こうとしているポートが別のアプリケーションによってすでに使用されていることを意味します。netstatを使用して、開いているポートを確認してから、使用可能なポートを使用してみてください。

また、正しいIPアドレスにバインドしているかどうかを確認してください(ローカルホストであると想定しています)

于 2013-03-04T10:03:12.710 に答える
44

Address already in useport現在の実行に割り当てようとしているが、すでに他のプロセスに占有/割り当てられていることを意味します。

開発者であり、多くのテストを必要とするアプリケーションで作業している場合は、同じアプリケーションのインスタンスがバックグラウンドで実行されている可能性があります(適切に停止するのを忘れている可能性があります)

したがって、このエラーが発生した場合は、ポートを使用しているアプリケーション/プロセスを確認してください。

Linuxでは、を使用してみてくださいnetstat -tulpn。このコマンドは、実行中のすべてのプロセスを含むプロセスリストを一覧表示します。

アプリケーションがポートを使用しているかどうかを確認します。 そのアプリケーションまたはプロセスが別の重要なものである場合は、どのプロセス/アプリケーションでも使用されていない別のポートを使用することをお勧めします。

とにかく、あなたはあなたのポートを使用するプロセスを停止し、あなたのアプリケーションにそれを取らせることができます。

Linux環境を使用している場合は、次のことを試してください。

  • netstat -tulpnプロセスを表示するために使用
  • kill <pid>これにより、プロセスが終了します

Windowsを使用している場合は、

  • netstat -a -o -nポートの使用状況を確認するために使用します
  • taskkill /F /PID <pid>そのプロセスを殺すために使用する
于 2018-06-01T05:22:53.533 に答える
10

上記のように、ポートはすでに使用されています。これはいくつかの理由が原因である可能性があります

  1. 他のいくつかのアプリケーションはすでにそれを使用しています。
  2. close_waitプログラムがもう一方の端がプログラムを閉じるのを待っているとき、ポートは状態にあります。参照( https://unix.stackexchange.com/questions/10106/located-connections-in-close-wait-state)。
  3. プログラムがtime_wait状態になっている可能性があります。SO_REUSEADDR別の投稿で説明されているように、待機するか、ソケットオプションを使用できます。

netstat -a | grep <portno>ポートの状態を確認してください。

于 2013-03-04T10:15:07.723 に答える
5

アドレスがすでに使用されている場合は、プロセスがポートを使用している人を殺したいだけですか?

lsof -ti:PortNumberGoesHere | xargs kill-9

ソースとインスピレーションこれ

PS:netstatはまだインストールされていないため、使用できませんでした。

于 2021-06-21T09:01:36.920 に答える
1

私もその問題に直面していましたが、解決しました。 クライアント側とサーバー側の両方のプログラムがIDEの異なるプロジェクト(私の場合はNetBeans)にあることを確認してください。次に、ローカルホストを使用していると仮定して、両方のプログラムを2つの異なるプロジェクトとして実装することをお勧めします。

于 2018-04-01T08:30:03.960 に答える
1

また、sockファイルに十分な権限(読み取りと書き込み)を付与していない場合にも発生します。

sockに含まれるフォルダーとsockファイルに期待されるアクセス許可を追加するだけです。

 chmod ug+rw /path/to/your/
 chmod ug+rw /path/to/your/file.sock

それなら楽しんでください!

于 2019-10-26T19:56:36.550 に答える
1

すべてのノードプロセスを終了するには:

killall -9 node
于 2022-01-24T00:45:36.640 に答える