WinSock (TCP Socket), KEEPALIVE



  • Hi!

    Wisst ihr zufällig bei welchem Socket einer TCP Verbindung die KEEPALIVE Option gesetzt werden muss wenn ich möchte, dass die Verbindung permanent überprüft wird?

    Muss ich dies beim Serversocket (der Socket der accept() ausführt) setzen und/oder beim Clientsocket, oder bei dem Socket der von accept() bei jeder neuen Verbindung zurückgegeben wird? Bzw. "erbt" ein so ein Verbindungssocket die Einstellungen des eigentlichen Serversockets?

    Theoretisch würde ich sagen, es muss auf dem Serversocket und dem Clientsocket aktiviert werden, aber ich bin mir nicht sicher...

    Vielen Dank für eure Hilfe!



  • Ein wenig OT - ich habe das KEEPALIVE immer als nicht sehr verlässlich angesehen (abhängig von der TCP Implementation etc.). Desshalb denke ich auch, dass ein "Alive Mechanismus" auf Applikations Ebene unerlässlich ist.



  • Ich schreibe nur eine art Wrapper der die TCP Funktionen stark vereinfachen soll (erstellen eines TCP Servers mittels einer einzigen Funktion etc.). Die Keep Alive Sache wollte ich implementieren, damit User selbst entscheiden können, ob sie es verwenden oder nicht.



  • Ist es eher nicht so das z.B. Windows nur mittels DisconnectEx eine richtiges Disconnect vornimmt?

    Daher sollten bei den meisten implemantationen eigentlich die "virtuelle" verbindung sogar nach einem closesocket vorhanden sein......

    greetz



  • Das dachte ich auch, aber sobald ich z.B. den Server per closesocket() schließe, wird augenblicklich bei recv() des Clients ein Error zurückgegeben. Also nehme ich mal an, dass closesocket() einen disconnect vornimmt.



  • Naja,..

    nur Disconnect sendet eigentlich einen FIN,.. ich müsste mir jetzt zwar per wireshark das nochmal angucken aber ich vermute eher das recv in einen timeout für den handshake läuf und deswegen einen fehler ausgibt.

    Wie gesagt nur Vermutung!!!

    greetz



  • Ja aber ein Timeout ist doch normal nicht so kurz? Bei so einem kurzen Timeout würde bei jeder Kleinigkeit die Verbindung abreißen.

    Wenn ich mal Zeit habe, sehe ich mir das vl. genauer an.



  • Hab das Problem auch bei einem HTTP-Client gehabt.
    Meine Lösung war:
    1. wurde "Connection: close" empfangen dann
    2. reconnect
    wenn nicht 1., dann testen ob was empfangen werden kann. Wenn nicht dann 2.

    Für jede bessere Lösung wäre auch ich dankbar.


Anmelden zum Antworten