$ ./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
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
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)
Pradheep
Wie oben erwähnt, wird der Port bereits verwendet. Dies kann mehrere Gründe haben
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
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
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
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:
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