Salve a tutti.. avrei bisogno di aiuto.. ho necessità di realizzare un server UDP concorrente, nel senso che sia capace di gestire più richieste da parte di client in contemporanea.. In particolare il server deve essere costituito da 4 processi pre-forked, nel momento in cui si iniziano le operazioni. Ho cercato molto in rete su come fare ma ho trovato moltissimi esempi usando TCP e ZERO con UDP.
In particolare nella versione che ho buttato giù del server creo mediante chimata alla funzione fork() i 4 child richiesti, ma poi se lancio i client questi non riescono a collegarsi al server.. Potete darmi quanlche dritta a riguardo!?
Vi posto il codice del main del server UDP




codice:
int main (int argc, char *argv[]) 
{
  int sock, result;
  int port;
  int number, number2; //numero di byte ricevuti con la recvfrom e con la sendto
  struct sockaddr_in servAddr;
  char buffRic[BUFLENGHT];
  char buffInv[BUFLENGHT];
  char RfileName[30];
  int len=sizeof(clientAddr);

  //for errlib to know the program name "server"
  prog_name = argv[0];
	
  //converte una stringa in un intero per memo il numero di porta di ascolto del server
  port=atoi(argv[1]);
  printf("Server UDP in ascolto sulla porta %d.\n",port);

  printf("--------------------------------------------------------\n");
  printf("Inizializzazione servizi in corso...\n");

  //creo il socket UDP
  sock=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
  if(sock<0)
    printf("Error in function socket()\n");
    else
      printf("1. socket() done.\n");
  
  //mi preparo per la bind() inserendo le info sul server nella struttura servAddr
  memset(&servAddr, 0, sizeof(servAddr));
  servAddr.sin_family = AF_INET;
  servAddr.sin_port = htons(port);
  servAddr.sin_addr.s_addr = htonl(INADDR_ANY);

  printf("--> Server listening on %s:%u \n", inet_ntoa(servAddr.sin_addr), ntohs(servAddr.sin_port));
  
  //bind per il socket creato
  result=bind(sock,(struct sockaddr *)&servAddr,sizeof(servAddr));
  if(result<0)
    printf("Error in function bind().\n");
    else
      printf("2. bind() done.\n");

  printf("--------------------------------------------------------\n"); 

  
  int numChild=0;
  int pid;
  
  //preforking di due processi child in attesa di connessioni sul socket UDP
  while((pid = fork())!=0 && numChild<1)
     {  numChild++;  }

  
  //codice eseguito solo dai childs
  if(pid==0)
  {         
  while(1)
   {
      printf("Child [%d]..Waiting for connections..\n",getpid());

      strcpy(buffRic,"");

      //rcvfrom per la stringa contenente il comando digitato dal client
      number=recvfrom(sock,buffRic,BUFLENGHT,0,(struct sockaddr *)&clientAddr,&len);
      if(number<0)
         printf("error in recvfrom().\n");
      buffRic[number]='\0';
      printf("\nConnection from client %s:%d to child [%d]\n", inet_ntoa(clientAddr.sin_addr), (int) ntohs(clientAddr.sin_port),getpid());
      printf("Dati ricevuti:%s",buffRic);
      
      if(buffRic[0]=='U' && buffRic[1]=='P' && isspace(buffRic[2])>0)
         {
           printf("identificata richiesta di upload.\n");
           strcpysub(RfileName,buffRic,3);
           printf("Nome del file richiesto:%s\n",RfileName);
           usleep(30000000);
           //ricezione_file(RfileName,sock);
         }
         else if(buffRic[0]=='D' && buffRic[1]=='O' && buffRic[2]=='W' && buffRic[3]=='N' && isspace(buffRic[4])>0)
            {
              printf("identificata richiesta di download.\n");
              strcpysub(RfileName,buffRic,5);
              printf("Nome del file richiesto:%s\n",RfileName);
              usleep(30000000);
              //invio_file(RfileName,sock);
            }  
            else printf("comando client non identificato.\n");

   } //while(1)
   }//if(pid==0)
   else if (pid>0)
     printf("Sono il padre [%d]\n.",getpid());
     else
       printf("boh!!\n");

  close(sock);
}