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"?