Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    5

    chat client-server

    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"?
    W.O.R.A!!

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    5
    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;
    }
    W.O.R.A!!

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,310

    Moderazione

    Il linguaggio va indicato anche nel titolo, come da Regolamento.

    Qui l'ho aggiunto io, tienilo a mente per il futuro.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.