Socket richtig beenden in C

Gast #3830431
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
Gast #3830438
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.
Moderator Persönliche Seite #3830450
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);
Gast #3830474
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.
Gast #3830563
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren