Lo metto in un formato più capibile:
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 9034   // porta di ricezione dei client

int main(void)
{
    fd_set master;                 // lista dei file descrittori del master
    fd_set read_fds;               // lista temporanea dei file descrittori per il select()
    struct sockaddr_in myaddr;     // indirizzo del server
    struct sockaddr_in remoteaddr; // indirizzo del client
    int fdmax;                     // numero max dei file descrittori
    int listener;                  // descrittore socket in ascolto
    int newfd;                     // ultimo socket descrittore accettato
    char buf[256];                 // buffer di trasmissione del client
    int nbytes;
    int yes=1;                     
    socklen_t addrlen;
    int i, j;
    FD_ZERO(&master);              // azzeramento delle impostazioni del master
    FD_ZERO(&read_fds);

    // ottiene il listener
    if ((listener = socket(PF_INET, SOCK_STREAM, 0)) == -1) 
	{
        perror("socket");
        exit(1);
    }
    if (setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &yes, \
        sizeof(int)) == -1) 
	{
        perror("setsockopt");
        exit(1);
    }
    // bind
    myaddr.sin_family = AF_INET;
    myaddr.sin_addr.s_addr = INADDR_ANY;
    myaddr.sin_port = htons(PORT);
    memset(myaddr.sin_zero, '\0', sizeof myaddr.sin_zero);
    if (bind(listener, (struct sockaddr *)&myaddr, sizeof myaddr) == -1) 
	{
        perror("bind");
        exit(1);
    }
    // listen
    if (listen(listener, 10) == -1) 
	{
        perror("listen");
        exit(1);
    }
    // Aggiunge l'ascoltatore per impostare il master
    FD_SET(listener, &master);
    fdmax = listener;

    for(;;) {
        read_fds = master; // realizzazione di una copia nella variabile temporanea
        if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) 
		{
            perror("select");
            exit(1);
        }
      // Esegue le connessioni esistenti, attraverso la ricerca di dati da leggere
      for(i = 0; i <= fdmax; i++) 
	  {
          if (FD_ISSET(i, &read_fds)) 
		  {
              if (i == listener) 
			  {
                  // Gestisce le nuove connessioni
                  addrlen = sizeof remoteaddr;
                  if ((newfd = accept(listener, \
                       (struct sockaddr *)&remoteaddr, &addrlen)) == -1) 
				  {
                       perror("accept");
                  } 
				  else 
				  {
                       FD_SET(newfd, &master); // Aggiungere al set master
                       if (newfd > fdmax) 
					   {   
                           fdmax = newfd;
                       }
                       printf("selectserver: new connection from %s on " \
                           "socket %d\n", \
                           inet_ntoa(remoteaddr.sin_addr), newfd);
                  }
              } 
			  else 
			  {
                  // Gestisce i dati di un client
                  if ((nbytes = recv(i, buf, sizeof buf, 0)) <= 0) 
				  {
                       // gestisce gli errori di connessione del client
                       if (nbytes == 0) 
					   {
                           // connessione chiusa
                           printf("selectserver: socket %d hung up\n", i);
                       } 
					   else 
					   {
                           perror("recv");
                       }
                       close(i); // chiusura
                       FD_CLR(i, &master); // rimuove dal set master
                  } 
				  else 
				  {
                       // Abbiamo ottenuto dei dati da un client
                       for(j = 0; j <= fdmax; j++) 
					   {
                           // i dati vengono inviati a tutti i client connessi
                           if (FD_ISSET(j, &master)) 
						   {
                               // Tranne l'ascoltatore e noi stessi
                               if (j != listener && j != i) 
							   {
                                   if (send(j, buf, nbytes, 0) == -1) 
								   {
                                       perror("send");
                                   }
                                }
                           }
                       }
                  }
              } 
          }
      }
  }
  return 0;
}