Fehler: Adresse wird bereits verwendet, während Socket mit Adresse verbunden ist, aber die Portnummer wird von `netstat` frei angezeigt
Ich versuchte mich zu binden meine socket(server-socket an port-Nummer 8000
. Es funktionierte und hat den job für mich. Am Ende der code, den ich in der Nähe der Buchse. Den nächsten Augenblick habe ich meinen code wieder und es zeigt mir, dass die Adresse bereits in Benutzung ist. Ich habe gedruckt, die Bedeutung der Fehlerwerte strerror(errno);
um zu sehen, ob mein code richtig funktioniert an jeder Stelle. Um zu überprüfen, ob der port frei ist, ich habe es mit netstat
aber es zeigt, dass die port-Nummer 8000
ist kostenlos. Es passierte mir oft. Jedes mal, wenn ich dann warten Sie ein paar Sekunden und dann beginnt es wieder zu arbeiten. Ich bin mit der c-Sprache. Also, was ist er Grund für dieses Verhalten von meinem OS.
Nach ein paar Sekunden habe ich den code ausführen und dann funktioniert es.
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ sudo ./a.out
Socket Creation: Success
File open: Success
Socket Bind: Address already in use
Socket Listen: Address already in use
^C
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ sudo netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1348/lighttpd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 984/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1131/cupsd
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1211/mysqld
tcp6 0 0 :::22 :::* LISTEN 984/sshd
tcp6 0 0 ::1:631 :::* LISTEN 1131/cupsd
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ sudo ./a.out
Socket Creation: Success
File open: Success
Socket Bind: Address already in use
Socket Listen: Address already in use
^C
anirudh@anirudh-Aspire-5920:~/Desktop/testing$
InformationsquelleAutor der Frage Durin | 2011-02-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe laufen in das gleiche Problem auch. Es liegt daran, dass man das schließen der Verbindung zum sockel, aber nicht die Steckdose selbst. Den sockel können Sie einen TIME_WAIT-Zustand (um sicherzustellen, dass alle Daten übertragen wurden, TCP garantiert die Zustellung wenn möglich) und nehmen Sie bis zu 4 Minuten nach release.
oder, für eine WIRKLICH detaillierte/technische Erklärung, überprüfen Sie diesen link
Es kann lästig sein, um sicher zu sein, aber es gibt keinen wirklichen Weg, um es und es ist kein bug.
InformationsquelleAutor der Antwort icfantv
Versuchen Sie mit netcats wie diese:
netstat -ntp
ohne-l
. Es wird sich zeigen, tcp-Verbindung inTIME_WAIT
Zustand.InformationsquelleAutor der Antwort hipe
Ich weiß, es ist schon eine Weile her, seit die Frage gestellt wurde, aber ich war in der Lage, eine Lösung zu finden:
Diesem set die sockel können wiederverwendet werden sofort.
Ich entschuldige mich, wenn diese "falsch" ist. Ich bin nicht sehr erfahren mit sockets
InformationsquelleAutor der Antwort Supamee
Geben Sie einfach
in das terminal, dann sollte der Fehler nicht mehr vorhanden ist.
InformationsquelleAutor der Antwort programmer
Wie gesagt, Ihr Schaft wahrscheinlich in
TIME_WAIT
Zustand. Dieses Problem ist gut beschrieben Thomas A. Feine hier.Zur Zusammenfassung, socket schließen Prozess Folgen Diagramm unten:
Thomas sagt:
Mit
SO_REUSEADDR
wird Häufig vorgeschlagen, die auf internet, aber Thomas hinzufügen:InformationsquelleAutor der Antwort Jezz
Sogar icfantv Antwort auf diese Frage ist schon perfekt, ich habe noch mehr Erkenntnisse in meinem test.
Als einen server-socket in den listening-status, wenn es nur im listening-status, und es sogar akzeptiert anfordern und abrufen von Daten von der client-Seite, aber ohne das senden von Daten handeln. Wir konnten immer noch den server neu starten, nachdem es aufgehört. Aber wenn keine Daten senden Handlung geschieht in der server-Seite an den client, die den gleichen Dienst(gleicher port) neu starten, wird dieser Fehlermeldung: (Address already in use).
Ich glaube, dies wird verursacht durch das TCP/IP-design-Prinzipien. Wenn der server sendet die Daten zurück zum client, müssen Sie sicherstellen, dass die Daten senden gelingt, um dies zu tun, die OS(Linux) benötigen, überwachen Sie die Verbindung auch von der server-Anwendung geschlossen wird diese Buchse.
Aber ich glaube immer noch kernel-socket-designer verbessern könnte dieses Problem.
InformationsquelleAutor der Antwort Clock ZHONG
die Fehler, die ich erhielt, war:
den fix habe ich entdeckt:
in /usr/lib/systemd/system/cockpit-service, den ich geändert
line :
:
so, wie Sie sehen können, ich nahm die Auseinandersetzung über selinux
dann lief ich:
dann stöberte ich auf:
Ich nahm die selbst-signiertes Zertifikat und wurde
anmelden können erfolgreich auf cockpit und verwenden Sie es normalerweise.
dies ist alles auf einer fedora25 Maschine. die 9090 port bereits
Hinzugefügt wurden mit
firewall-cmd
InformationsquelleAutor der Antwort JamesAD-0
Für AF_UNIX, die Sie verwenden können call unlink (path); nach dem close () - socket in "server" - app
InformationsquelleAutor der Antwort dr_begemot