Serwer C i problem z accept

0

Witam,
mam pewien problem z serwerem współbieżnym TCP. Polega na tym, że po zmianie flagi Work, accept nadal przyjmuje połączenia. Chodzi mi głównie o to, żeby unikając zamknięcia gniazda, serwer nie przyjmował nowych połączeń. Serwer przyjmuje pewnych klientów, wydane zostaje polecenie stop na serwerze i żaden nowy klient nie może się połączyć.

while(Work){
			klientDl= sizeof(klientAdr);
			klientGniazdo = (int*)malloc(sizeof(int));
			if ((*klientGniazdo = accept(serwGniazdo, (struct sockaddr *) &klientAdr, &klientDl)) < 0){
				perror("accept() - nie udalo się");
				exit(1);
			printf("Przetwarzam klienta %s\n", inet_ntoa(klientAdr.sin_addr));
			pthread_create(&threadClientId, NULL, &ObslugaKlienta, (void*)klientGniazdo);
			}

W czym może być problem?
Pozdrawiam

0

Jedno połączenie na pewno przyjmie, następnych już pewnie nie. Czemu? Bo po przyjęciu klienta serwer przeleci znów pętlę i zatrzyma się na accept. W efekcie nawet jeśli klient wyda polecenie "stop" to serwer mimo wszystko będzie już w trakcie oczekiwania na kolejnego klienta i stop zadziała dopiero od następnej kolejki.

0

Dlaczego nie przestaniesz nasłuchiwać? Klienci mają dostawać timeouty przy próbie połączenia gdy serwer jest "przystopowany"?

0

Dziękuję Panom za zainteresowanie tematem ;) Tzn serwer ma wydawać polecenie stop, ale uświadomiłem sobie, że jak wydam polecenie stop, to mimo wszystko jeszcze siedzi na tym acceptcie ;/. Jakie byłoby najlepsze rozwiązanie w takiej sytuacji (i najprostsze)? select()? wolałbym żeby timeout był dla tych klientów którzy próbują się połączyć...
Dzięki ;)

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