Forum: PC-Programmierung Socket richtig beenden in C


von Tobi (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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);

von Udo S. (urschmitt)


Lesenswert?

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?

von Tobi (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

**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
von Walter T. (nicolas)


Lesenswert?

Matlab oder C?

von Tobi (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.