Hallo, ich habe ein Programm geschrieben, dass ein Socket (TCP) auf Port 51000 aufbaut. Nach dem Aufbau wird die Verbindung mit close (Rückgabewert 0) geschlossen. Jetzt möchte ich wieder eine Verbindung aufbauen, jedoch scheitert das beim Ausführen von Bind. Könnt Ihr mir sagen wie ich ein Socket richtig schließe um im Anschluss eine Verbindung auf dem gleichen Port aufzubauen? Mit freundlichen Grüßen Tobi
Tobi schrieb: > Könnt Ihr mir sagen wie ich ein Socket richtig schließe um im Anschluss > eine Verbindung auf dem gleichen Port aufzubauen? Close ist schon richtig, er ist aber eine Zeitlang noch blockiert. Das ist normal. Kann man nur verhindern in dem man so eine Option ( ReuseAddr oder so) verwendet.
Yep. TIME_WAIT ist dafür gedacht, dass noch im Netz herumstreunende Pakete, die eigentlich für den alten Serverprozess bestimmt waren, sauber „verenden“ können, statt dem neuen Server zugestellt zu werden. Hier der entsprechende Code-Ausschnitt aus sshd.c:
1 | /* Create socket for listening. */
|
2 | listen_sock = socket(ai->ai_family, ai->ai_socktype, |
3 | ai->ai_protocol); |
4 | if (listen_sock < 0) { |
5 | /* kernel may not support ipv6 */
|
6 | verbose("socket: %.100s", strerror(errno)); |
7 | continue; |
8 | }
|
9 | if (set_nonblock(listen_sock) == -1) { |
10 | close(listen_sock); |
11 | continue; |
12 | }
|
13 | /*
|
14 | * Set socket options.
|
15 | * Allow local port reuse in TIME_WAIT.
|
16 | */
|
17 | if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, |
18 | &on, sizeof(on)) == -1) |
19 | error("setsockopt SO_REUSEADDR: %s", strerror(errno)); |
20 | |
21 | /* Only communicate in IPv6 over AF_INET6 sockets. */
|
22 | if (ai->ai_family == AF_INET6) |
23 | sock_set_v6only(listen_sock); |
24 | |
25 | debug("Bind to port %s on %s.", strport, ntop); |
Ich kenne das nur von Server Sockets, also wenn du ein listen auf den Socket machst, sonst gibst du ja auch kein Port an. Könnte es sin, daß du beim Close noch eine offene Verbindung zu einem Client hast?
Ich beende die Verbindung auf der Client seite unter Matlab mit fclose bevor ich eine neue erstelle. Das hinzufügen von:
1 | int optval = 1; |
2 | if (setsockopt(servSock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval) < 0) |
3 | {
|
4 | printf( "setsockopt failed\n"); |
5 | return -1; |
6 | }
|
hat leider nichts gebracht.
**verwirt guck** Hast du das Problem nun auf der Server- oder auf der Client-Seite? Beschreib' doch die Umstände mal etwas genauer sowie die konkrete Fehlermeldung bzw. den Fehlercode (errno).
:
Bearbeitet durch Moderator
AAAHH ich habe glaube den Fehler gefunden. Mit close habe ich den Socket descriptor for client verwendet und nicht den Socket descriptor for server. Morgen werde ich das ganze mal testen. Vielen Dank
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.