Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    12

    Server UDP concorrente

    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);
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    12

    risolto :D

    Tutto risolto grazie lo stesso..

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,313

    Moderazione

    Originariamente inviato da LuisMay
    Tutto risolto grazie lo stesso..
    In genere, l'etica del forum suggerisce di postare la soluzione al problema in modo che chiunque dovesse trovarsi ad affrontare un ostacolo analogo in futuro possa facilmente individuarne la soluzione.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.