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?
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).
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. ''.
Sie haben einen Prozess, der diesen Port bereits verwendet. Mit netstat -tulpn
kann man die Prozess-ID ermitteln, die einen bestimmten Port verwendet.
Wie oben erwähnt, wird der Port bereits verwendet .. Dies kann verschiedene Gründe haben
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 ).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>
.
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,
netstat -tulpn
, um die Prozesse anzuzeigenkill <pid>
Dies beendet den VorgangWenn Sie Windows verwenden,
netstat -a -o -n
, um die Portverwendungen zu überprüfentaskkill /F /PID <pid>
, um diesen Prozess zu beendenIch 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.