wake-up-neo.com

Bindung fehlgeschlagen: Adresse wird bereits verwendet

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?

30
TamiL

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

Überprüfen Sie auch, ob Sie an die richtige IP-Adresse gebunden sind (ich gehe davon aus, dass dies localhost wäre).

22
Techmonk

Jeder ist richtig. Wenn Sie jedoch auch damit beschäftigt sind, Ihren Code zu testen, kann es sein, dass Ihre own - Anwendung den Socket "besitzt", wenn er relativ schnell startet und stoppt. Versuchen Sie SO_REUSEADDR als Socket-Option:

Was genau macht SO_REUSEADDR?

Diese Socket-Option teilt dem Kernel mit, dass dieser Port auch dann verwendet werden kann, wenn dieser Port belegt ist (im Status TIME_WAIT). Wenn es beschäftigt ist, Bei einem anderen Status erhalten Sie jedoch eine bereits verwendete Adresse Error. Es ist nützlich, wenn Ihr Server heruntergefahren wurde und dann sofort neu gestartet, während an seinem Port noch Sockets aktiv sind. Sie Sie sollten wissen, dass unerwartete Daten verwirrt werden können Ihr Server, aber obwohl dies möglich ist, ist es nicht wahrscheinlich.

Es wurde darauf hingewiesen, dass "ein Socket ein 5-Tuple ist (Proto, lokal Addr, lokaler Port, Remote-Addr, Remote-Port). SO_REUSEADDR sagt nur .__, dass Sie lokale Adressen wiederverwenden können. Das 5-Tuple muss noch einzigartig sein!" von Michael Hunter ([email protected]). Das ist wahr und das Daher ist es sehr unwahrscheinlich, dass unerwartete Daten jemals von .__ gesehen werden. Ihr Server Die Gefahr ist, dass ein solcher 5-Tupel noch schwimmt rund um das Netz und während es herumspringt, eine neue Verbindung von demselben Client auf demselben System erhält er dasselbe Remote-Port. Dies wird von Richard Stevens in `2.7 Bitte .__ erklärt. Erklären Sie den TIME_WAIT-Status. ''.

47
Joe

Sie haben einen Prozess, der diesen Port bereits verwendet. Mit netstat -tulpn kann man die Prozess-ID ermitteln, die einen bestimmten Port verwendet.

23
Ed Heal

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

  1. eine andere Anwendung verwendet es bereits. 
  2. Der Port befindet sich im close_wait-Status, wenn Ihr Programm darauf wartet, dass das andere Ende das program.refer schließt. ( https://unix.stackexchange.com/questions/10106/orphaned-connections-in-close-wait-state ).
  3. Das Programm befindet sich möglicherweise im time_wait-Status. Sie können warten oder die Socket-Option SO_REUSEADDR verwenden, wie in einem anderen Beitrag erwähnt.

Überprüfen Sie den Portstatus mit netstat -a | grep <portno>.

5
Pradheep

Address already in use bedeutet, dass die port, die Sie für Ihre aktuelle Ausführung zuordnen möchten, bereits belegt ist oder einem anderen Prozess zugewiesen ist.

Wenn Sie Entwickler sind und an einer Anwendung arbeiten, für die viele Tests erforderlich sind, kann es sein, dass eine Instanz derselben Anwendung im Hintergrund ausgeführt wird.

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

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

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

Jedenfalls können Sie den Prozess, der Ihren Port verwendet, anhalten und Ihre Anwendung es übernehmen lassen.

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

  • Verwenden Sie netstat -tulpn, um die Prozesse anzuzeigen
  • kill <pid> Dies beendet den Vorgang

Wenn Sie Windows verwenden,

  • Verwenden Sie netstat -a -o -n, um die Portverwendungen zu überprüfen
  • Verwenden Sie taskkill /F /PID <pid>, um diesen Prozess zu beenden
4
prime

Ich war auch mit diesem Problem konfrontiert, aber ich habe es gelöst Stellen Sie sicher, dass sowohl die Programme für die Client- als auch die Serverseite verschiedene Projekte in Ihrer IDE sind, in meinem Fall NetBeans. Wenn Sie also localhost verwenden, empfehle ich Ihnen, beide Programme als zwei verschiedene Projekte zu implementieren.

0
AyanG_WAP7