Socket richtig beenden in C

Gast #3830431
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.