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