codice:
/* server iterativo dell'applicazione echo che utilizza la select */
#include "basic.h"
#include "my_signal.h"
int
main(int argc, char **argv)
{
FILE *fd1;
int listend, connd, sockd;
int i, maxi, maxd,numero;
int ready, client[FD_SETSIZE];
char buff[MAXLINE],num[MAXLINE], nomefile, nome ,stringa, righe[MAXLINE],*riga;
fd_set rset, allset;
ssize_t n;
struct sockaddr_in servaddr, cliaddr;
socklen_t cliaddr_len;
if( (listend = socket(AF_INET, SOCK_STREAM, 0)) < 0)
err_sys("errore in socket");
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
if( (bind(listend, (struct sockaddr *) &servaddr, sizeof(servaddr))) < 0)
err_sys("errore nella bind");
if( listen(listend, LISTENQ) < 0 )
err_sys("errore nella listen");
maxd = listend; /* inzializza il numero di descrittori */
maxi = -1;
for ( i = 0; i < FD_SETSIZE; i++)
client[i] = -1; /* inizializza l'array client a -1 */
FD_ZERO(&allset); /* inizializza a zero tutti i descrittori */
FD_SET(listend, &allset); /* setta il descrittore di ascolto */
for ( ; ; ) {
rset = allset;
/* setta l'insieme di descrittori da controllare in lettura */
if( (ready = select(maxd+1, &rset, NULL, NULL, NULL)) < 0 )
err_sys("errore nella select");
if( FD_ISSET(listend, &rset) ) {
/* se è arrivata una richiesta di connessione al socket di ascolto
viene invocata la accept e creato un socket di connessione */
cliaddr_len = sizeof(cliaddr);
if( (connd = accept(listend, (struct sockaddr *) &cliaddr, &cliaddr_len)) < 0)
err_sys("errore nella accept");
for(i = 0; i < FD_SETSIZE; i++)
if( client[i] < 0 ) {
/* scrive il descrittore del nuovo socket nel primo posto
libero di client */
client[i] = connd;
break;
}
if( i == FD_SETSIZE ) /* non ci sono posti liberi in client */
err_quit("troppi client");
FD_SET(connd, &allset);
/* altrimenti inserisce connd tra i descrittori da controllare */
if( connd > maxd )
maxd = connd;
if( i > maxi )
maxi = i;
if( --ready <= 0 ) /* cicla fino a quando ci sono ancora descrittori
leggibili da controllare */
continue;
}
for( i = 0; i <= maxi; i++ ) {
/* controlla tutti i socket attivi per controllare se sono leggibili */
if( (sockd = client[i]) < 0 )
/* se il descrittore non è stato selezionato viene saltato */
continue;
if ( FD_ISSET(sockd, &rset) ) {
/* se sockd è leggibile invoca la readline */
if ( (n = readline(sockd, buff, MAXLINE)) == 0) {
/* se la connessione è stata chiusa dal client chiude il
descritore di connessione */
if( close(sockd) == -1 )
err_sys("errore nella close");
FD_CLR(sockd, &allset);
/* rimuove sockd dalla lista dei socket da controllare */
client[i] = -1; /* cancella sockd da client */
}
else{
sscanf(buff,"%s %s" ,nomefile,nome);
if((nomefile==0) && (nome==0))fputs("Errore sscanf",stdout);
fd1=fopen(nomefile,"r");
if(fd1==NULL)fputs("Errore apertura file",stdout);
for(; ;){
riga=fgets(righe,MAXLINE,fd1);
sscanf(buff,"%s %d",stringa,&numero);
if(riga==NULL)break;
if(nome==stringa){
sprintf(num,"%d", numero);
break;
}
}
fclose(fd1);
if( writen(sockd, num, strlen(num)) != strlen(num) )
err_sys("errore nella write");
}
if ( --ready <= 0 )
break;
}
}
}
}