TCP, Recv-Funktion hängt trotz KEEPALIVE

Verhindert TCP Keepalive (mit kleinen Timeouts), dass der Client nach dem Tod des Servers auf recv hängt?

Das Szenario

Server und Client laufen auf getrennten Rechnern:

Clients stellt über TCP mit der Option KEEPALIVE @ eine Verbindung zu einem Server heClient sendet "Hallo Server" und wartet auf eine AntwortServer empfängt "Hallo Server" und antwortet "Hallo Client"Client erhält Antwort, schläft 10s und Schritte 2-4 werden wiederholt (Schritt 1 wird jetzt übersprungen - Verbindung bleibt erhalten)

Während des Ruhezustands des Clients ist der Server jetzt ausgeschaltet:

Client wacht aufSendet "Hallo Server" und wartet auf eine AntwortNach 20 Minuten gibt recv auf - Ich hatte erwartet, dass KEEPALIVE die recv-Funktion nach @ unterbrich 45 Sekunden:

Einstellen der KEEPALIVE-Optionen:

void TCPclient::setkeepalive()
{
   int optval;
   socklen_t optlen = sizeof(optval);

   /* Check the status for the keepalive option */
   if(getsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &optval, &optlen) < 0) {
        throw std::string("getsockopt");
   }

   optval = 1;
   optlen = sizeof(optval);
   if(setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0) {
      close(s);
      exit(EXIT_FAILURE);
   }

    optval = 2;
    if (setsockopt(sock, SOL_TCP, TCP_KEEPCNT, &optval, optlen) < 0) {
        throw std::string("setsockopt");
    }

    optval = 15;
    if (setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, &optval, optlen) < 0) {
        throw std::string("setsockopt");
    }

    optval = 15;
    if (setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, &optval, optlen) < 0) {
        throw std::string("setsockopt");
    }   
}

linux 3.2.0-84-generic

Antworten auf die Frage(4)

Ihre Antwort auf die Frage