Problem s "tuhnutim" serveru

Mikulas Patocka mikulas na artax.karlin.mff.cuni.cz
Pondělí Leden 22 10:24:06 CET 2001


>Zdravim vsechny,
>udelal jsem C/S aplikaci ktera ma server na linuxu spousteny pres inetd -
>podobne, jako je treba popd a pod.. Server proste cte z stdin zpravy od win
>klienta a na na stdout zapisuje odpovedi. Pokud se nepodari precist/zapsat
>prislusny pocet byte (nebo pride signal SIGPIPE), pak to server bere jako ze
>spadlo spojeni (nebo klient) a ukonci se.
>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)
>
>Takze se mi postupne mnozi mrtve instance serveru ...
>Vzhledem k tomu, ze treba popd se mi takhle nemnozi, tak predpokladam, ze to
>jde nejak korekne vyresit a ja nekde neco opomnel obslouzit nebo tak ...
>jenze netusim co ... zatim me jen napadlo spustit dalsi thread ktery by
>hlidal nejaky timeout, ale moc korektni (ani jednoduche) mi to nepripada ...
>Nevi pls nekdo, jak tohle (pokud mozno korektne) vyresit ? Jak poznam, ze
>spojeni uz ve skutecnosti neexistuje ?
>
>Predem moc dekuji za kazdou radu ...
>
>S pozdravem
>                        David Janko.
>P.S.: Spojeni je tcp/ip ....

Muzete pouzit SO_KEEPALIVE (man 4 socket). To zpusobi, ze se bude
periodicky kontrolovat, zda ma klient spojeni porad otevrene.

Nepomuze to ovsem v pripade, kdy klientsky program zatuhne a operacni
system klienta bude spojeni porad drzet. Proti tomu si musite sam
napsat timeouty - pomoci select nebo alarm.

Mikulas



Další informace o konferenci Linux