Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [C, socket] Server in ascolto su due porte
Forum - C/C++ - [C, socket] Server in ascolto su due porte

Avatar
Malo88 (Normal User)
Newbie


Messaggi: 3
Iscritto: 27/11/2011

Segnala al moderatore
Postato alle 10:34
Lunedì, 28/11/2011
Ciao,
Sto facendo un progetto per scuola che richiede la creazione di un server di chat/scambio file. Per fare ciò ho pensato che il server debba avere due porte: una per la chat e una per lo scambio file.
Il codice seguente è quello che ho scritto e che mi crea una sola porta per la chat ed esegue la bind su quella porta:

/*************************************************************/
   /* Controlla i parametri di IP e PORTA passati come          */
   /* argomento                                                 */
   /*************************************************************/
  if(argc!=3)
   err_quit("Usage: %s <PortChat> <PortFile>\n",argv[0]);
  if((atoi(argv[1])<10000)&&(atoi(argv[1])>12000))
   err_quit("La porta deve essere tra 10000 e 12000\n");

   /*************************************************************/
   /* Crea un AF_INET stream socket per ricevere connessioni    */
   /* in arrivo                                                 */
   /*************************************************************/
  if( (listen_sd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
            err_sys("socket error");

   /*************************************************************/
   /* Permette di riutilizzare i socket descriptor              */
   /*************************************************************/
   rc = setsockopt(listen_sd, SOL_SOCKET,  SO_REUSEADDR,
                   (char *)&on, sizeof(on));
   if (rc < 0)
   {
      perror("setsockopt() failed");
      close(listen_sd);
      exit(-1);
   }

   printf("*****************PROXY SERVER*****************\n");

   /*************************************************************/
   /* Ottiene l'hostname della macchina                         */
   /*************************************************************/
  if(gethostname(hn, sizeof(hn)) ==0) printf("hostname di questa macchina: %s\n", hn);
  else printf("errore durante la stampa dell'hostname di questa macchina\n");

   /*************************************************************/
   /* Imposta i socket come non bloccanti. Tutti i socket per   */
   /* le connessioni in arrivo saranno anche'essi non bloccanti */
   /* finchè non erediteranno quello stato dal listening socket.*/
   /*************************************************************/
   rc = ioctl(listen_sd, FIONBIO, (char *)&on);
   if (rc < 0)
   {
      perror("ioctl() failed");
      close(listen_sd);
      exit(-1);
   }

   /*************************************************************/
   /* Esegue la bind                                          */
   /*************************************************************/
  bzero(&servaddr,sizeof(servaddr)); //ripulisce una stringa CAMPO1: il puntatore da pulire , CAMLPO2: il numero di bytes da pulire.
  servaddr.sin_family      = AF_INET;
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servaddr.sin_port        = htons( atoi(argv[1]));
  if( (bind(listen_sd, (SA *) &servaddr,sizeof(servaddr))) < 0)
           err_sys("bind error ");

Ora io vorrei fare la stessa cosa con l'altra porta del server. Come faccio? Devo fare un'altra bind? Devo cambiare i parametri di servaddr? (notate che le porte del server sono date in input argv[])

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:41
Lunedì, 28/11/2011
Devi creare un altro socket

Ultima modifica effettuata da nessuno il 28/11/2011 alle 13:26


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Malo88 (Normal User)
Newbie


Messaggi: 3
Iscritto: 27/11/2011

Segnala al moderatore
Postato alle 15:18
Lunedì, 28/11/2011
Ok, quindi faccio un'altra chiamata socket tipo così:
  if( (sd_file = socket(AF_INET, SOCK_STREAM, 0)) < 0)
            err_sys("socket error");
e poi farò la bind su di essa. Il problema però è che non so come impostare la struttura prima della bind:
  servaddr.sin_family      = AF_INET;
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servaddr.sin_port        = htons( atoi(argv[1]));
  if( (bind(listen_sd, (SA *) &servaddr,sizeof(servaddr))) < 0)
           err_sys("bind error ");
questa struttura contiene l'indirizzo del server, come modifico servaddr.sin_port (porta su cui sta in ascolto il server), mettendoci la nuova porta? Se uso sempre servaddr non vado a sovrascriverla?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 16:40
Lunedì, 28/11/2011
Devi usare un'altra variabile struttura diversa dalla prima !

I due socket devono essere indipendenti !


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Malo88 (Normal User)
Newbie


Messaggi: 3
Iscritto: 27/11/2011

Segnala al moderatore
Postato alle 11:02
Martedì, 29/11/2011
Ok quindi dovrei fare tipo:

if( (sd_file = socket(AF_INET, SOCK_STREAM, 0)) < 0)
            err_sys("socket error");

  fileaddr.sin_family      = AF_INET;
  fileaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  fileaddr.sin_port        = htons( atoi(argv[2]));
  if( (bind(sd_file, (SA *) &fileaddr,sizeof(fileaddr))) < 0)
           err_sys("bind error ");

Ma così l'ip del server rimane lo stesso giusto?
Cmq grazie, provo e ti faccio sapere.

PM Quote