Tata, slazem se da metoda klijent-po-klijent nije prihvatljiva za ozbiljan servis, ali samo zato sto drugi klijenti moraju da cekaju dok server obradjuje zahtev jednog klijenta.
A sta mislis (pitanje vazi i za ostale) da se od onog primera (chatserv.c) napravi multi-thread server, nesto kao Apache?
Znaci pri startu kreira recimo 5 pod-procesa, koji cekaju da ih glavna nit 'zaposli'?
Tu bi znaci glavna nit samo cekala da se nova konekcija uspostavi, a zatim dalju komunikaciju prepustala nekom pod-procesu (koji je slobodan)?
Ne znam da li ste gledali chatserv.c, ali on koristi FD_SET.
Ja jos ne znam sta je ovo, pa ako neko zna, neka mi objasni.
Glavna rutina mu izgleda ovako:
Code:
while(1) {
clients_fds();
FD_SET(sd,&rfds); /* za accept */
do {
sret=select(MAX_CLIENTS,&rfds,NULL,NULL,NULL); // hvata dogadjaj
} while(sret<0 && errno==EINTR);
if(sret<0) {perror("select"); exit(1);}
if(FD_ISSET(sd,&rfds)) nov_klijent(sd); // nova konekcija
for(i=0;i<MAX_CLIENTS;i++)
if(FD_ISSET(i,&rfds) && clients[i].status!=0)
{
int l,j;
l=read(i,buf,sizeof(buf));
if(l==0) [..] fprintf(stderr,"Konekcija %d zatvorena\n",i);
if (l>0) [..] stigla_poruka(i);
}
}
a promenljiva sd je:
Code:
int sd;
sd=socket(AF_INET,SOCK_STREAM,0);
Ono [..] sam ja snip-ovao kod koji je nebitan za analizu.
Ovde mi, kao sto rekoh, uopste nije jasna uloga FD_SET-a i FD-ISSET-a, kao i ona f-ja "select", koja hvata dogadjaje.
Sve ostalo je jasno kao dan.
BTW, ja bih thread ubacio onde gde se uspostavlja nova konekcija.
Ali, ne znam kako da izdvojim da novo-kreirani thread osluskuje samo njegovog klijenta... :(
I na kraju, kad bih ja uspeo to sto hocu, da li bi to bilo "prihvatljivo" za neki ozbiljan daemon (naravno pod uslovom da imam dobru organizaciju, tj. da jedan thread ne remeti druge thread-eve)?
Ako mozete pomognite, ja cu danas da probam da napravim od ovoga multi-thread server. :)
Ili ako neko vec ima gotov primer multi-thread servera, dobro bi dosao.