potoki i select - opoznienie..

0

Witam, tym razem mam problem z przesylaniem inta przez potok. Sytuacja wyglada tak: mam serwer i dzialaja w nim 2 procesy - jeden do akceptacji nowych polaczen (po polaczeniu sie klienta wysylany jest deskryptor nowego gniazda do drugiego procesu) i drugi proces do obslugi klientow w ktorym za pomoca select() nasluchuje na przyjscie czegos od ktoregos klienta badz od procesu akceptujacego..
No i problem polega na tym ze drugi proces odbiera przeslany deskryptor, ale dopiero po polaczeniu sie kolejnego klienta, tzn. jesli polaczy sie klient1 nic nie odbierze, dopiero gdy polaczy sie klient2 odbiera deskryptor klienta1, gdy polaczy sie klient3, odbiera klient2..
no i nie wiem czym to moze byc spowodowane..
kod:

/* proces akceptujacy) */
 if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr,&sin_size)) == -1) {
                perror("accept");
                continue;
            }	    
	    sprintf(log_buf,"%d",new_fd);
	    write(p_kom[1],log_buf,strlen(log_buf));
...

/*proces obslugujacy */
                  FD_ZERO(&readset);
	    FD_SET(p_fd,&readset);
	    while(set=readset,(whosel=select(FD_SETSIZE,&set,NULL,NULL,NULL))>0) {
		   if(FD_ISSET(p_fd,&set)){ // jesli wyslano cos z procesu odbierajacego polaczenia
			    read(p_fd,buf,255); // p_fd=p_kom[2] ;]
			    printf("%s",buf);  
			   
		    }		    
	    }
0
int canread(int fileno){
  fd_set a;
  timeval tv;
  tv.tv_sec=0;
  tv.tv_usec=0;
  FD_ZERO(&a);
  FD_SET(fileno,&a);
  if(select(fileno+1,&a,0,0,&tv)<0)return -1;
  return FD_ISSET(fileno,&a);
}

http://www.freebsd.org/cgi/man.cgi?query=select&apropos=0&sektion=0&manpath=FreeBSD+6.2-RELEASE&format=html

...the descriptors from 0 through nfds-1 in the descriptor sets are examined...

0

ok, to sie wytlumacze na poczatku: w ksiazce "unix - programowanie systemowe" bylo napisane ze pierwszy parametr to "liczba deskryptorow plikow, ktorymi zainteresowany jest proces". no ale juz bede wiedzial :).
Po drugie: dalej to nie dziala, :(
niby wchodzi do bloku if(FD_ISSET(...)){..} ale "printf("%s",buf); " jest wywolywane dopiero przy kolejnym kliencie :.

No i jeszcze pytanie takie: skoro ten pierwszy parametr to jest maksymalny deskryptor to czy uzycie stalej FD_SETSIZE to blad (z tego co wiem, ale to jest nadal wiedza z ww ksiazki, to ta stala okresla maksymalna liczbe deskryptorow uzywanych w select), a jesli jednak trzeba uzywac tego najwiekszego deskryptora to moze to byc lekko niewygodne (klienci przeylaczaja sie i rozlaczaja i trzeba by za kazdym razem sprawdzac ktory deskryptor jest najwiekszy.. )

0
  1. to nie jest max deskryptor tylko max deskryptor+1 w zestawie
  2. FD_SETSIZE na pewno nie obejmuje calego zakresu int. poza tym ma sie tak do deskryptorow jak rozmiar tablicy int do wartosci komorek, czyli dokladnie nijak, rownie dobrze mozesz losowac sobie liczbe.
  3. zloz reklamacje i oddaj ta ktorej uzywasz, a jesli bedziesz mogl to polecam 2 ksiazki:
    "Pisanie programów internetowych" (A. Sopala)
    "Linux. Programowanie dla zaawansowanych"
  4. czytaj strony mana ze zrozumieniem

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