serwer/klient problem z wylogowaniem

0

no wiec jest tak, mam programik (w zasadzie 2 klient i serwer), calosc ma byc prostym komunikatorem konsolowym.
Wszystko w miare dobrze dziala, ale mam problem z wylogowaniem klienta. Schemat jest mniej wiecej taki: uzytkownik wpisuje 'quit', wysylana jest informacja do serwera, proces obslugujacy danego klienta przesyla informacje do glownego procesu i konczy sie, glowny proces po odebraniu informacji usowa uzytkownika z listy dostepnych i rozsyla do pozostalych uzytkownikow informacje o tym. W praktyce to nie dziala i nie wiem dlaczego :\ kod (fragmetny w ktorych jest to obslugiwane):

KLIENT:
else if(!strcmp(kom,"quit")){ // zakonczenie programu
if (!IsLogged)
	exit(0);
else {
	sprintf(buf,"%c %s",CMD_QUIT,data.login);
	send(sockfd,buf,strlen(buf),0);
	exit(0);
}
}
SERWER:
(proces obslugujacy kllienta):
else if(buf[0]==CMD_QUIT){
	forward(pkom,sock);  // funckja forward dziala, pkom gniazdo do komunikacji z glownym procesem, sock gniazdo klienta
	exit(0);
}

(glowny proces) - tu gdzies sie to wszystko wysypuje

else if(buf[0]==CMD_QUIT){			//CMD_QUIT  
// Cli - lista dostepnych klientow, tCli - obecnie obslugiwany klient
	while(recv(tCli->sock,buf,sizeof(buf),MSG_DONTWAIT)>0) ;
	sprintf(buf,"%c#%s",CMD_USRQUIT,tCli->nick);
	FD_CLR(tCli->sock,&readset);
	close(tCli->sock);
	delcli(&Cli,tCli->nick);
	SendToAll(Cli,buf);
}

Jesli jest zalogowany tylko jeden klient to go elegancko wylogowuje, jesli wiecej to juz nie..
Jesli by sie komus chcialo to moge przeslac caly kod do sprawdzenia..

0

opisz co sie dzieje w przypadku tych nastepnych logoutow,z kodu to trudno wywnioskowac tutaj cos

0

Po wylogowaniu sie jednego klienta pozostali nie moga sie komunikowac, nowi nie moga sie logowac(serwer nie odpowiada), wyglada to tak jakby glowny proces serwera sie zapetlal :, jesli byl zalogowany tylko jeden i sie wyloguje to pozniej inni (on sam tez) moga logowac sie i rozmawiac..

0

hm.. to czyste zgadywanie z mojej strony, ale moze jak procesie obslugi klietna robisz:

forward(pkom,sock);exit(0);

to socket niezostaje zamkniety prawidlowo wyslany i zamkniety i serwer z drugiej strony sobie czeka i czeka na nim? sprobuj dac shutdown na sockecie tuz przed exit

0

No wlasnie sek w tym ze to jest moj pierwszy raz z socketami i nie mam pojecia gdzie moze byc blad a nie wiem nawet w ktorym kierunku isc ze zgadywaniem :
z shutdown dalej niestety to samo..

0

um.. przepraszam, mialem na mysli parke:
shutdown(sock);
close(sock);
:) poza tym zarzuc troche wiecej kodu albo powiedz co i jak robisz.. szczerze mowiac sredni wyobrazam sobie przypadek w ktorym blad na jednym polaczeniu powodowalby zablokowanie pozostalych.. pewnie masz gdzies indziej jakas wpadke. poza tym czemu do wewnatrzserwerowej komunikacji uzywasz socketow? tylko zycie utrudniasz sobie.. na pipe'ach chyba duzo latwiej mimo ze semantyka podobna.

0

sockety bo wystarczy mi jeden do kazdego procesu, potokow musialbym miec dwa i pamietac do ktorego pisac a z ktorego czytac.
a co do kodu i wyjasniania to nie ma sensu tu rzucac calego (wczesniejsze fragmenty to wszystko co dotyczy samego wylogowywania sie, a wszystko inne dziala). jak chcesz moge ci wyslac caly kod na maila i mniej wiecej wybadasz, bo kurcze ja nie widze co tu moze byc zle :\

0

ok, wyslij mailem. szczerze od razu uprzedze ze nie wiem ile mi to dni zajmie, bo ostatnio kiepsko z czasem stoje, ale postaram sie w miare szybko.
z socketami a pipe'ami - sockety maja tylko ten jeden minus, ze jest ich systemowo ograniczona ilosc, ale przy sensownej ilosci procesow to jeden pies

0

ok, poszlo juz..
a co do powyzszego posta, to nie jest tak ze system ogolnie ogranicza liczbe otwartych deskryptorow niezaleznie gniazd/plikow czy potokow?

0

oczywiscie ze ogranicza. z tym ze tych ostatnich po zsumowaniu po wszystkich aplikacjach moze byc duzo wiecej, a socketow nie da sie wiecej niz 65k z racji natury pojecia 'port'..

mmmmmmmmmmmm.... pomyslawszy dluzej.. to tcp/ip narzuca ze port ma 16 bit.. inny protokol moze miec wiecej, wiec na dobra sprawe i gniazd moze byc wiecej.. ok, odwoluje :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1