Oppure

Loading
28/11/11 9:34
Malo88
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[])
aaa
28/11/11 10:41
nessuno
Devi creare un altro socket
Ultima modifica effettuata da nessuno 28/11/11 12:26
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
28/11/11 14:18
Malo88
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?
aaa
28/11/11 15:40
nessuno
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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
29/11/11 10:02
Malo88
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.
aaa