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