TCP Socket-Verbindung beendet sich nicht

  • Hi,


    ich muss gerade in C herausfinden, ob eine IP Kamera (POE versorgt, hängt sich manchmal auf) noch funktioniert. Dazu würde ich gerne in C prüfen, ob der Port (im Beispiel unten 9999) offen / erreichbar ist. Prinzipiell funktioniert das mit dem folgenden Code und ich erkenne zuverlässig den offenen Port, jedoch verursache ich dadurch auf der Gegenseite offene Verbindungen, bis diese in den Timeout laufen (testweise läuft gerade lokal ein VLC und stellt einen Dummystream auf dem Port bereit). Gibt es keine Möglichkeit, das ich die von mir initiierte Verbindung nachhaltig beenden kann?


    Hier der Code-Schnipsel:

    Ich dachte mit close(sockfd) beende ich auch die offenen Verbindungen. Leider sieht das in netstat anders aus:

    Code
    tcp        0      0 192.168.0.21:9999    0.0.0.0:*               LISTEN
    tcp        0      0 192.168.0.21:35192   192.168.250.21:9999    TIME_WAIT
    tcp        0      0 192.168.0.21:55794   192.168.250.21:9999    TIME_WAIT

    Gefühlt verschwinden die offenen Verbindungen (TIME_WAIT) nach ca. 60s (vermutlich das Standard-Timeout).


    Hat hier jemand einen Hinweis, wie ich die Verbindung nachhaltig schliessen kann? Über bash und netstat könnte ich es auch machen, jedoch läuft schon eine andere Logik in C un würde das gerne in einem Aufwasch erledigen.


    Danke schonmal im Voraus...

  • Ich habe es noch nicht verwendet, aber man kann, wenn ich das noch recht erinnere, den Timeout beeinflussen oder sogar abschalten.

    Das muss, irgendwo bei den socket-Optionen gewesen sein, wenn ich nicht ganz falsch liege.

    Gruss
    SHF


  • Code
    if (connect(sockfd,(struct sockaddr *) &serv_addr, sizeof(serv_addr))<0) {
       }
    //else {
    //   // hmm, ja und nun, was möchtest du mit dieser Verbindung tun? Schliessen wäre ja ne gute Idee...
    //   }
    
    //und das 'close(sockfd);' sieht ja auch falsch positioniert aus.
    // Sollte man ein socket nicht nur dann schließen, wenn man es überhaupt erfolgreich öffnen konnte?
  • Code
    if (connect(sockfd,(struct sockaddr *) &serv_addr, sizeof(serv_addr))<0) {
       }
    //else {
    //   // hmm, ja und nun, was möchtest du mit dieser Verbindung tun? Schliessen wäre ja ne gute Idee...
    //   }
    
    //und das 'close(sockfd);' sieht ja auch falsch positioniert aus.
    // Sollte man ein socket nicht nur dann schließen, wenn man es überhaupt erfolgreich öffnen konnte?

    Hab gerade schon an mir gezweifelt, aber die Logik ist dennoch richtig. Ich möchte falls der Port nicht erreichbar ist (der von dir zitierte if-Zweig) eine Aktion durchführen (im Code-Schnippsel schreibe ich ins Log, in der finalen Software würde ich die POE Kamera aus- und wiedereinschalten - ist per POE Injektor betrieben, deshalb einfach möglich). Falls der Port erreichbar ist (wäre dein else-Zweig) will ich mit dem Port nichts machen.

    Bezüglich dem close hast du vermutlich Recht, dass der nur im if-Zweig von connect(...) notwendig wäre, momentan versuche ich immer zu schliessen. Löst aber auch nicht das Problem, dass momentan auf der Gegenseite die Verbindung nur aufgrund abgelaufenen Timeouts VLC-seitig die Verbindung geschlossen wird. Mein Wunsch wäre ein explizites und gewolltes schliessen von Client-Seite aus. In den Optionen von connect bzw. socket finde ich dazu leider noch keine Optionen.


    Ein Test mit curl (ohne weitere Optionen) zeigte gerade, dass die Verbindung sofort geschlossen wird, sobald ich curl durch Ctrl-C beende. Einziger Unterschied bei curl: hier lade ich tatsächlich Daten runter und vermutlich merkt der Server, wenn nichts mehr angenommen wird. Sollte doch aber auch mit einem harmlosen Port-Ping funktionieren.

  • SO_LINGER

    Das war, was ich in Erinnerung hatte.


    Aber keine Ahnung ob es hier was bringt, bzw. überhaupt anwendbar ist.

    Mir war es nur zufällig aufgefallen, als ich mal was zu den Puffern nachgeschlagen hatte.

    Gruss
    SHF


  • SO_LINGER

    Das war, was ich in Erinnerung hatte.


    Aber keine Ahnung ob es hier was bringt, bzw. überhaupt anwendbar ist.

    Mir war es nur zufällig aufgefallen, als ich mal was zu den Puffern nachgeschlagen hatte.

    Guter Punkt. Teste ich heute/morgen Abend.

  • SO_LINGER

    Das war, was ich in Erinnerung hatte.


    Aber keine Ahnung ob es hier was bringt, bzw. überhaupt anwendbar ist.

    Mir war es nur zufällig aufgefallen, als ich mal was zu den Puffern nachgeschlagen hatte.

    Hat leider keine Besserung gebracht. Werde mal die libcurl bemühen, da ich scheinbar mit curl keine wartenden Ports erzeuge... Dennoch dank dir für deine Idee.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!