2013-03-04 34 views
22

に私は以下のポートにソケットをバインドしようとしています:バインドに失敗しました:アドレスがすでに使用

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 

なぜこのエラーが発生しますか。

+1

別のポート番号を使用しますか? – Nick

+2

まだ使用されていないアドレスを使用してください。 –

+0

私はそれを持っている..私は別のポートを選択...助けをありがとう.. ありがとう。 – TamiL

答えて

18

エラーは通常、開いているポートが別のアプリケーションによってすでに使用されていることを意味します。netstatを使用して開いているポートを確認し、使用可能なポートを使用してみてください。あなたは右のIPアドレスにバインドされている場合

また

+1

また、フィドラー(http://www.telerik.com/fiddler)のようなWebデバッグプロキシを実行している可能性もあります。私は私のマシンで同じエラーが発生していたので、私はフィドラーを閉じて、うまくいった。 – farskeptic

+1

TIME-WAIT状態に残っているポートがあることもあります。 IPアドレスが間違っていた場合、エラーは「要求されたアドレスを割り当てることができませんでした」と仮定されるべきデフォルトは 'localhost'ではなくINADDR_ANYです。 – EJP

15

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

36

誰もが正しいです(私はそれをlocalhostされるだろうと想定しています)確認してください。しかし、あなたのコードをテストするのに忙しい場合は、自身のアプリケーションは、起動して比較的早く停止するとソケットを "所有"している可能性があります。

SO_REUSEADDRは正確に何ですか

このソケットオプションは、このポートがビジー状態であっても( TIME_WAIT状態)、先に進んで再使用することをカーネルに伝えます。ビジー状態の場合は、 が別の状態で、まだ使用中のアドレスを取得します エラー。サーバーがシャットダウンされていて、ソケットがまだそのポート上でアクティブな間にすぐに が再開された場合に便利です。 は、予期しないデータが入った場合、サーバ を混乱させる可能性がありますが、これは可能ですが、そうではありません。ソケットが5タプル(プロト、ローカル addrは、ローカルポート、リモートのaddr、リモートポート)である」ことが指摘されている。SO_REUSEADDRはちょうどあなたがローカルアドレスを再利用することができ を言います。5タプルをまだしなければならない

be ユニーク!マイケルハンター([email protected])これは当てはまります。この は、予期しないデータがサーバ に表示されることはほとんどありません。危険なのは、そのような5タプルがまだネット上に浮かんでいることです。同じシステム上の同じクライアントからの新しい接続 は、同じ リモートポートを取得します。これはRichard Stevensによって `` 2.7 Please TIME_WAIT状態を説明してください。

+1

https://easyengine.io/tutorials/nginx/troubleshooting/emerg-bind-failed-98-address-already-in-use/ 上記のリンクのみが私の問題を解決しました...私は(SO_REUSEADDR | SO_REUSEPORT)この両方の問題が発生しました。 –

+1

@iDebD_gh SO_REUSEPORTはUDP用です。 – EJP

+0

問題のポートがLoad Balancerの背後にある場合、SO_REUSEADDRは負の影響を持つ可能性があることに注意してください。 – kmarsh

4

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

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

netstat -a | grep <portno>を実行してポートの状態を確認します。

+6

このポート番号でこのアプリケーションを手動で停止するにはどうすればよいですか? – user2925949

+0

CLOSE-WAITは、この端がリモートエンドではなく閉じることをポートが待機していることを意味します。それはあなたのリンクも言います。 – EJP

関連する問題