##############################################################################
Programma della conferenza distribuita
Copyright (C) 19aa
Autori: Andrea Lanzi, Giampaolo Fresi Roglia
Questo programma e' software libero; e' lecito ridistribuirlo e/o
modificarlo secondo i termini della Licenza Pubblica Generica GNU
come pubblicata dalla Free Software Foundation; o la versione 2
della licenza o (a scelta) una versione successiva.
Questo programma e' distribuito nella speranza che sia utile, ma
SENZA ALCUNA GARANZIA; senza neppure la garanzia implicita di
COMMERCIABILITA' o di APPLICABILITA' PER UN PARTICOLARE SCOPO. Si
veda la Licenza Pubblica Generica GNU per avere maggiori dettagli.
Ognuno dovrebbe avere ricevuto una copia della Licenza Pubblica
Generica GNU insieme a questo programma; in caso contrario, la si
puo' ottenere dalla Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, Stati Uniti.
Gli autori possono essere contattati ai seguenti indirizzi:
Andrea Lanzi : shadow.net@tiscalinet.it
Giampaolo Fresi Roglia : gian_fresi@iol.it
##############################################################################
#include "server_subs.h"
void ignora()
{
signal(SIGPIPE, ignora);
}
int main(int argc, char **argv)
{
// STRUTTURE DI MEMORIA PER LA GESTIONE DELLE VARIE CONNESSIONI.
struct element vector[FOPEN_MAX];
struct guest *joiners;
struct fifo FIFO_list;
int logfd; //DESCRITTORE DEL FILE DI LOG
// DESCRITTORI DI SOCKET
int fd, sockfd, newsockfd=0, or_fd=0, numcli=0, clilen ;
// STRUTTURA PER INDIRIZZI INTERNET
struct sockaddr_in cli_addr ;
// STRUTTURA PER INDIRIZZI INTERNET
fd_set rfds ;
fd_set afds ;
int nfds;
int port ; // NUMERO DI PORTA DEI SERVIZI
char *logfile = "server.log";
// APERTURA DEL FILE DI LOG
logfd = open( logfile, O_CREAT | O_WRONLY | O_TRUNC, 00600);
FIFO_list.first=NULL; //INIZIALIZZAZIONE DEI PUNTATORI ALLE LISTE
FIFO_list.last=NULL;
joiners = NULL;
signal( SIGPIPE, ignora ); //GESTIONE DEL SEGNALE SIGPIPE
if(argc != 2)
{
printf("Lanciare il coordinatore con il numero di porta\n");
exit(0);
}
port=atoi( argv[1] ); // ASSEGNAZIONE DELLA PORTA DEL SERVER.
init( vector ) ; // INIZIALIZZA LA STRUTTURA DEL VETTORE
// APERTURA DELLA SOCKET PASSIVA.
if((sockfd = passive_socket( port, BACKLOG ))<0)
exit(0) ;
nfds = FOPEN_MAX ;//NUMERO MASSIMO DI DESCRITTORI CONSENTITI
// INIZIALIZZA LA MSCHERA DEI DESCRITTORI PER LA SELECT
FD_ZERO( &afds ) ;
//SETTA NELLA MASCHERA IL DESCRITTORE DELLA SOCKET PASSIVA
FD_SET( sockfd, &afds) ;
// CICLO PER LA GESTIONI DELLE CONNESSIONI
while( 1 ){
// COPIA DELLA STRUTTURA DALLA SORGENTE ALLA DESTINAZIONE
bcopy( (char*) &afds, (char*) &rfds, sizeof(rfds) ) ;
if(select( nfds, &rfds, (fd_set *) 0, (fd_set *) 0,
(struct timeval*) 0) < 0)
{
perror("select") ;
exit( 0 );
}//fine if
// CONTROLLO DI NUOVE CONNESSIONI
//GESTIONE DELL'INPUT SULLA SOCKET PASSIVA
if(FD_ISSET(sockfd, &rfds)){
clilen = sizeof( cli_addr ) ;
newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr, &clilen ) ;
printf("Accetto partecipante\n");
if (newsockfd < 0 )
{
perror( "accept") ;
}
else
FD_SET( newsockfd, &afds ) ;
}//fine if
// GESTIONE DEI CLIENTI CONNESSI
for (fd=0;fd<FOPEN_MAX;fd++)
{
if(fd != sockfd && FD_ISSET(fd, &rfds))
if(check(logfd, fd, &or_fd, &numcli, vector,
&joiners, &FIFO_list)<0)
{
FD_CLR(fd, &afds) ;
close(fd);
printf("Chiusa connessione con partecipante\n");
}
}//fine for
}//fine while
}//fine main