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