Bindung fehlgeschlagen: Adresse wird bereits verwendet

Lesezeit: 6 Minuten

Benutzeravatar von TamiL
Tamil

Ich versuche, einen Socket an einen Port unten zu binden:

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

Aber es gibt:

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

Warum tritt dieser Fehler auf?

  • Verwenden Sie eine andere Portnummer?

    – Nick

    4. März 2013 um 10:01 Uhr

  • Verwenden Sie eine Adresse, die noch nicht verwendet wird.

    – David Schwartz

    4. März 2013 um 10:02 Uhr

  • Ich habe es .. Ich wähle verschiedene Ports … Danke für die Hilfe .. Danke an alle.

    – Tamil

    4. März 2013 um 10:18 Uhr


  • Ich hatte das gleiche Problem, als ich das Serverprogramm geschlossen habe, während das Clientprogramm noch ausgeführt wurde. Dies steckte die Steckdose ein TIME_WAIT Zustand. Hier ist eine ausführliche Diskussion des Problems: Wie kann man einen Socket in TIME_WAIT zwangsweise schließen?

    – narendra-choudhary

    5. April 2016 um 6:10 Uhr

  • Warum wurde diese Frage geschlossen? Es behandelt ein häufiges Problem bei der Socket-Programmierung, und die Antworten auf die Fragen sind nützlich und richtig. Es hat mir auf jeden Fall geholfen.

    – Elliott-Strand

    22. April 2017 um 17:43 Uhr

Joes Benutzeravatar
Jo

Alle haben Recht. Wenn Sie jedoch auch damit beschäftigt sind, Ihren Code zu testen, wird Ihr besitzen Die Anwendung “besitzt” möglicherweise immer noch den Socket, wenn sie relativ schnell startet und stoppt. Versuchen SO_REUSEADDR als Steckdosenoption:

Was genau macht SO_REUSEADDR?

Diese Socket-Option teilt dem Kernel mit, dass er, selbst wenn dieser Port belegt ist (im Zustand TIME_WAIT), trotzdem weitermachen und ihn wiederverwenden soll. Wenn es beschäftigt ist, aber einen anderen Status hat, erhalten Sie immer noch einen Fehler, dass die Adresse bereits verwendet wird. Es ist nützlich, wenn Ihr Server heruntergefahren und dann sofort neu gestartet wurde, während noch Sockets auf seinem Port aktiv sind. Sie sollten sich darüber im Klaren sein, dass das Eintreffen unerwarteter Daten Ihren Server verwirren kann, aber obwohl dies möglich ist, ist es nicht wahrscheinlich.

Es wurde darauf hingewiesen, dass “ein Socket ein 5-Tupel ist (Proto, lokale Adresse, lokaler Port, entfernte Adresse, entfernter Port). SO_REUSEADDR sagt nur, dass Sie lokale Adressen wiederverwenden können. Das 5-Tupel muss immer noch eindeutig sein!” von Michael Hunter ([email protected]). Dies ist wahr, und deshalb ist es sehr unwahrscheinlich, dass Ihr Server jemals unerwartete Daten sieht. Die Gefahr besteht darin, dass ein solches 5-Tupel immer noch im Netz herumschwirrt, und während es herumhüpft, erhält eine neue Verbindung von demselben Client auf demselben System zufällig denselben entfernten Port. Dies wird von Richard Stevens in “2.7 Bitte erklären Sie den Zustand TIME_WAIT.” erklärt.

  • easyengine.io/tutorials/nginx/troubleshooting/… Der obige Link hat nur mein Problem behoben … Obwohl ich (SO_REUSEADDR | SO_REUSEPORT) beide verwendet habe, ist dieses Problem aufgetreten.

    – iDebD_gh

    4. März 2016 um 9:47 Uhr


  • @iDebD_gh SO_REUSEPORT ist nur für UDP.

    – Benutzer207421

    23. April 2017 um 10:44 Uhr

  • Beachten Sie, dass SO_REUSEADDR negative Auswirkungen haben kann, wenn sich der betreffende Port hinter einem Load Balancer befindet.

    – kmarsch

    24. Mai 2017 um 18:40 Uhr

Sie haben einen Prozess, der diesen Port bereits verwendet. netstat -tulpn ermöglicht es einem, die Prozess-ID zu finden, die einen bestimmten Port verwendet.

  • netstat: n: unknown or uninstrumented protocol

    – Dr.jacky

    7. September um 10:31 Uhr

Address already in use bedeutet, dass die port Sie versuchen, für Ihre aktuelle Ausführung zuzuweisen, ist bereits einem anderen Prozess belegt/zugewiesen.

Wenn Sie ein Entwickler sind und an einer Anwendung arbeiten, die viele Tests erfordert, wird möglicherweise eine Instanz derselben Anwendung im Hintergrund ausgeführt (möglicherweise haben Sie vergessen, sie ordnungsgemäß zu stoppen).

Wenn Sie also auf diesen Fehler stoßen, sehen Sie einfach, welche Anwendung/Prozess den Port verwendet.

Versuchen Sie es unter Linux mit netstat -tulpn. Dieser Befehl listet eine Prozessliste mit allen laufenden Prozessen auf.

Überprüfen Sie, ob eine Anwendung Ihren Port verwendet. Wenn diese Anwendung oder dieser Prozess ein weiterer wichtiger ist, möchten Sie möglicherweise einen anderen Port verwenden, der von keinem Prozess/Anwendung verwendet wird.

Auf jeden Fall können Sie den Prozess stoppen, der Ihren Port verwendet, und ihn Ihrer Anwendung überlassen.

Wenn Sie sich in einer Linux-Umgebung befinden, versuchen Sie,

  • Verwenden netstat -tulpn Prozesse anzuzeigen
  • kill <pid> Dadurch wird der Vorgang beendet

Wenn Sie Windows verwenden,

  • Verwenden netstat -a -o -n um die Portnutzungen zu überprüfen
  • Verwenden taskkill /F /PID <pid> um diesen Prozess zu beenden

  • kill -9 für Ubuntu?

    – Meric Özcan

    6. Oktober 2021 um 12:36 Uhr

Benutzeravatar von Techmonk
Techmonk

Der Fehler bedeutet normalerweise, dass der Port, den Sie öffnen möchten, bereits von einer anderen Anwendung verwendet wird. Versuchen Sie, netstat zu verwenden, um zu sehen, welche Ports offen sind, und verwenden Sie dann einen verfügbaren Port.

Überprüfen Sie auch, ob Sie an die richtige IP-Adresse gebunden sind (ich nehme an, es wäre localhost)

Benutzeravatar von Pradheep
Pradheep

Wie oben erwähnt, wird der Port bereits verwendet. Dies kann mehrere Gründe haben

  1. eine andere Anwendung verwendet es bereits.
  2. Der Hafen ist drin close_wait Zustand, wenn Ihr Programm darauf wartet, dass das andere Ende das Programm schließt.https://unix.stackexchange.com/questions/10106/orphaned-connections-in-close-wait-state).
  3. Das Programm könnte drin sein time_wait Zustand. Sie können warten oder die Socket-Option verwenden SO_REUSEADDR wie in einem anderen Beitrag erwähnt.

Tun netstat -a | grep <portno> um den Portstatus zu überprüfen.

  • Wie können wir diese Anwendung an dieser Portnummer manuell stoppen?

    – ypahalajani

    20. April 2016 um 6:07 Uhr

  • CLOSE-WAIT bedeutet, dass der Port darauf wartet, dass dieses Ende ihn schließt, nicht das entfernte Ende. Das sagt auch dein Link.

    – Benutzer207421

    23. April 2017 um 9:30 Uhr

  • CLOSE_WAIT bedeutet, dass Ihr Programm noch läuft und den Socket nicht geschlossen hat (und der Kernel darauf wartet, dass er dies tut). SO_REUSEADDR ist für Server u TIME_WAIT Steckdosen, trifft hier also nicht zu

    – Jaqueline P.

    7. April 2020 um 2:31 Uhr

  • Fenster: netstat -ano | findstr ":8080" (um pid – letzte Spalte – für Port zu finden) und dann taskkill /F /PID <pid> um den Prozess mit der PID zu beenden.

    – Felvhage

    7. August 2020 um 13:41 Uhr


Benutzeravatar der besten Wünsche
schöne Grüße

Wenn die Adresse bereits verwendet wird, können Sie einfach jeden Prozess töten, der den Port verwendet, den Sie verwenden können

lsof -ti:PortNumberGoesHere | Xargs töten -9

Quelle und Inspiration Dies.

PS: Netstat konnte nicht verwendet werden, da es noch nicht installiert ist.

  • Wie können wir diese Anwendung an dieser Portnummer manuell stoppen?

    – ypahalajani

    20. April 2016 um 6:07 Uhr

  • CLOSE-WAIT bedeutet, dass der Port darauf wartet, dass dieses Ende ihn schließt, nicht das entfernte Ende. Das sagt auch dein Link.

    – Benutzer207421

    23. April 2017 um 9:30 Uhr

  • CLOSE_WAIT bedeutet, dass Ihr Programm noch läuft und den Socket nicht geschlossen hat (und der Kernel darauf wartet, dass er dies tut). SO_REUSEADDR ist für Server u TIME_WAIT Steckdosen, trifft hier also nicht zu

    – Jaqueline P.

    7. April 2020 um 2:31 Uhr

  • Fenster: netstat -ano | findstr ":8080" (um pid – letzte Spalte – für Port zu finden) und dann taskkill /F /PID <pid> um den Prozess mit der PID zu beenden.

    – Felvhage

    7. August 2020 um 13:41 Uhr


Benutzeravatar von AbdolHosein
Abdol Hosein

Es passiert auch, wenn Sie Ihrer Sockendatei nicht genügend Berechtigungen (Lesen und Schreiben) erteilt haben!

Fügen Sie einfach die erwartete Berechtigung zu Ihrem in Socken enthaltenen Ordner und Ihrer Sockendatei hinzu:

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

Dann viel Spaß!

1419390cookie-checkBindung fehlgeschlagen: Adresse wird bereits verwendet

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy