Problem s "tuhnutim" serveru

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Neděle Leden 21 00:04:02 CET 2001


On Fri, 19 Jan 2001, David Janko wrote:

> Bohuzel ted jsem zjistil, ze existuje pripad, kdy spojeni spadne a
> server se presto tvari, ze je vsechno v poradku a stale stoji na
> read() ... a socket je dle netstat stale ve stavu ESTABLISHED, coz
> nechapu a nevim, co s tim ...
> Jak jsem zjistil, tak tento pripad nastane, kdyz:
> - server ceka na zpravu od klienta (je na read())
> - klienta odpojim od site (vytahnu kabel z eth)
> - pres ctrl+alt+del shodim klienta
> - zapojim kabel do eth ...
> (pokud jen win chcipnout, tak je vse OK a server se ukonci)

To je pochopitelne. TCP je ukonceno pouze na zaklade dohody, nebo
jednostrane v situaci, kdy se jedna z komunikujicich stran v zadnem
rozumnem case nedocka protokolem predepsane odpovedi od strany druhe.
Pokud server ceka na vstup od klienta, pak v ustalenem stavu nikdo nic
nevysila, a tudiz k zadnemu timeoutu nedojde.

Mozna reseni jsou dve: 1. pouzit na urovni TCP funkci "keep-alive",
tj. funkci, kdy bude server bude kazdych x casovych jednotek automaticky
testovat, zda-li je druha strana jeste pripojena (setsockopt(...,
SO_KEEPALIVE,...)), 2. definovat timeout na aplikacni urovni
(napr. funkci alarm()).

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux