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