PDA

Visualizza la versione completa : [c] un client e due server


ubuntuunixc
10-09-2008, 12:18
ciao raga
avrei bisogno di un aiuto in c

non riesco a connettere un client a due server distinti in particolare non riesco a capire come vanno scritte le varie socket bind ecc


nello specifico
il codice del server unico ma deve esssere utilizzato su apparecchi diversi quindi la porta di comunicazione deve essere specificata all'inizio


il problema che quando faccio partire il codice il client mi ritona subito la shelle senza
connettersi al server


vi posto la parte riguardante solo la connessione se poi voltete tutto il codice ve lo posto mq dopo ci sono solo letture di file

nel client



int main(int argc, char **argv)
{
indirizzo.sin_family =AF_INET ;
indirizzo.sin_port=htons(5208);
indirizzo.sin_addr.s_addr=htonl(INADDR_ANY);
fd1 = socket(PF_INET, SOCK_STREAM, 0);
connect(fd1, (struct sockaddr *) &indirizzo,sizeof(indirizzo));
indirizzo2.sin_family =AF_INET ;
indirizzo2.sin_port=htons(5209);
indirizzo2.sin_addr.s_addr=htonl(INADDR_ANY);
fd2 = socket(PF_INET, SOCK_STREAM, 0);
connect(fd2, (struct sockaddr *) &indirizzo2,sizeof(indirizzo2));


nel server



int main(int argc, char **argv)
{
porta=(int)argv[1];
printf("LA PORTA :%d",porta);
mio_indirizzo.sin_family = AF_INET;
mio_indirizzo.sin_port=htons(porta);
mio_indirizzo.sin_addr.s_addr=htonl(INADDR_ANY);
fd1 = socket(PF_INET, SOCK_STREAM, 0);
bind(fd1, (struct sockaddr *) &mio_indirizzo,sizeof(mio_indirizzo));
listen(fd1, 5);
while (1)
{
fd2 = accept(fd1,NULL,NULL);
if ((pid=fork())== 0)


nel server la porta passata su linea di comando corretta trasformarla in intero come ho fatto ?

shodan
10-09-2008, 12:35
No. Devi usare la atoi per convertire da stringa a int.

mico90
10-09-2008, 13:43
Faccio una precisazione su quello che ha detto shodan : l' argomento della funzione htons deve essere un intero, quindi devi prima convertire la stringa di caratteri in un intero, e poi chiamare htons con quel valore :

mio_indirizzo.sin_port=htons(atoi(porta));


Poi, quando chiami una funzione di Winsock ti conviene inserire dei costrutti per segnalare errori provenienti da suddette funzioni ; per esempio :



if (listen( ListenSocket, 1 ) == SOCKET_ERROR) {
printf("Error listening on socket.\n");
closesocket(ListenSocket);
WSACleanup();
return 1;
}



:ciauz:

Loading