Ciao a tutti!!! Ho provato a costruire una chat client-server, ma nella parte del server c'è un piccolo problema:
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; }
Perchè stampa: "bind: Address already in use"?