select
Karel Zak
zakkr na zf.jcu.cz
Úterý Leden 30 13:51:24 CET 2001
> Dobry den,
>
> Vytvarim program, ktery bude komunikovat pomoci socketu s vice clienty
> a pomoci volani select se snazim zjistit ktery deskriptor je pripraven
> pro zapis. Pokud provedu volani select ve smycce, tak program ceka (
> select blokuje proces ) jen
> na prvni moznost zapisu do socketu, dalsi volani selectu je uz
> neblokujici
> ale pokud by se ten klient odmlcel a trvalo by mu dele nez muze cist
> dalsi data, program by uviznul ve volani write a pokud by tam byl dalsi
> klient pripraveny pri prijem dat zrejmen by se na nej uz nedostalo (
> lepe receno, teprve az po ukonceni write na prvniho klienta ).
IMHO bych pouzil non-blocking mode a nejdrive se pokusil ta data
cist/psat a pokud se to nepovede tak cekal nejakou omezenou dobu
na select() apod.
> Vim ze by se to dalo obejit pomoci implementace konkurentniho serveru,
> tj. pokazde udelat fork a obsluhovat klienty v jinem nezavislem procesu,
> ale ja bych to chtel jako iterativni server. Jde to vubec ?
Pochopitelne, ze to jde. fork() / thready = teoreticka moznost
obsluhovat vice klientu najednou, nic vic. To znamena, ze pokud
vam staci v dany okamzit obsluhovat jen jednoho klienta a ostatni
cekaji tak to jde. Zakladni myslenka fork deamonu je, ze "master"
proces se stara jen hlavni socket a vznikla connection predava
fork potomkum. Ale jde udelat i to, ze bude jen jeden proces a ten
bude pomoci pozadavku odhalenych aktivitou na danem socketu prepinat
mezi spojenima a vse se bude dit v ramci jednoho procesu.
Staci jen pokud novy socket na noveho klienta od accept() pridate do
masky pro ten select(). A pak proste ten hlavni select bude checkovat
i toto nove spojeni. Pokud pak bude klient na serveru reprezentovan
nejakou strukturou tak bude stacit najit podle zrovna aktivniho soketu
k nemu patrici strukturu a zabyvat se danym klientem (apod.) a ostatni
nechat cekat. Je to cele jen veci nastaveni masky pro select() a
prepinani toho co dela program mezi danyma klientama dle "ziveho"
spojeni.
Pokud nechvatate tak presne todle bude snad zitra v CVS mape.jcu.cz
projektu. IMHO se to da opsat :-)
Karel
Další informace o konferenci Linux