[ dubrava @ 23.08.2005. 10:23 ] @
Problem je sledeci:
Potrebno je napraviti server koji ce odmah nakon podizanja primiti oko hiljadu zahteva za TCP konekcijom koje treba da obraditi tj. nakon odredjenog vremena sve konekcije moraju biti uspostavljene. Tada pocinje razmena podataka izmedju servera i klijenata: Server ce u svakom trenutku primati par stotina poruka od razlicitih klijenata. Pri tome treba naglasiti da ce poruke koje se razmenjuju izmedju servera i klijenta biti kratke(desetak bajtova). Kada procita poruku od klijenta server ce je obraditi i poslati 5 poruka ka 5 drugih klijenata i to na osnovu definisanog pravila. Takodje, potrebno je obezbediti ponovno uspostavljanje konekcije ako se konekcija sa nekim klijentom prekine iz nekog nepoznatog razloga i to treba da se ostvari automatski.
Dakle, potreban mi je savet o koncepciji softvera i alatu kojim se ovo moze najbolje ostvariti. U obzir dolaze Windows Sockets API i MFC(CSocket i CAsyncSocket klase). Dobro bi mi dosao i neki primjer slicnog programa. Pomagajte!
[ obucina @ 24.08.2005. 10:04 ] @
Server se dize i salje BROADCAST ili MULTICAST paket.

Klijenti je prime, svaki sebi odredi random timeout, npr od 1 do 5 sekundi i nakon timeout-a pokusava da se poveze. Na ovaj nacin nemas preopterecenje u vidu hiljadu istovremenih zahteva.

Zatim jos npr 2 puta ponovis BROADCAST ili MULTICAST paket, da bi se eventualno nepovezani povezali.

Asinhrono pratis promene na socket-ima. Gde se veza prekine, tu se povezes ponovo. Povremeno ponavljas ove BROADCAST ili MULTICAST pakete, da bi se novopridosle masine povezale.

Posto su ti paketi mali, mozda mozes da radis i sa UDP protokolom.

Naravno, da bi ti broadcast radio, moras biti na privatnoj mrezi. Ako pises program za internet, ne mozes koristiti BROADCAST ili MULTICAST.

[ _VampiR_ @ 24.08.2005. 10:05 ] @
Hmmmm, radio sam slicne stvari ali na unixu... A na Win platformi malo mi je i nelogicno raditi takav vid servera, pogotovo sto je velika sansa da padne prilikom "bombardovanja" portova sa toliko klijentskih masina...
[ Dragi Tata @ 24.08.2005. 11:35 ] @
Zaboravi MFC klase. Za tako nešto moraš da koristiš IO Completion ports i AcceptEx. Googlaj malo, ili ako te ne mrzi pogledaj kako je to odrađeno u Apache 2.0 za Windows.

[ Dragi Tata @ 24.08.2005. 13:26 ] @
E, da! Možda ne bi bila loša ideja da pogledaš ACE:

http://www.cs.wustl.edu/~schmidt/ACE.html
[ dubrava @ 24.08.2005. 14:35 ] @
Izgleda da je IO Completion ports jedino prihvatljivo resenje s obzirom da je to preporuka koju sam dobio na 90% foruma na kojima sam postavljao ovo pitanje, i nasih i stranih. Bilo koji drugi alat s obzirom na zahteve aplikacije izgleda ne pije vodu. Hvala na preporukama!
[ mipko @ 26.08.2005. 23:43 ] @
Iz licnog iskustva definitivno i jedino Async. I/O with completion port.
[ Dragi Tata @ 27.08.2005. 01:01 ] @
Citat:
mipko: Iz licnog iskustva definitivno i jedino Async. I/O with completion port.


Čisto da ne bude zabune, async socket su nešto drugo (šalju WM poruke). Ovo o čemu pričamo je overlapped IO i completion port.
[ dubrava @ 29.08.2005. 10:23 ] @
Ja sam to nekako ovako ukapirao: U slucaju IO completion porta vrsi se provera da li postoji nesto u njegovom redu za cekanje ali se provera vrsi neprekidno i slobodni thread-ovi obradjuju pakete. Jedino u slucaju da je zauzet citav thread pool thread koji je poslednji prihvatio zahtev prihvata i sledece pakete.