PDA

View Full Version : [C] Socket Client/Server


skipper_87
13-03-2014, 09:01
Buongiorno a tutti!
Ho un problema nella realizzazione di una chat client/server.
Il problema è che non riesco a gestire due client, ovvero il server risponde solo a uno e non a piu di un client connessi.

Il codice del server è piu meno cosi:

creo socket serverfd
bind();
listen(serverfd, );

pthread_t invio;
pthread_t ricevo;

while(true){
clientfd=accept(serverfd, );

new_client=malloc(1);
*new_client=clientfd;

pthread_create(&invio, NULL, funz_invio, (void*) new_client);
pthread_create(&ricevo, NULL, funz_ricevo, (void*) new_client);

return 0;
} //fine main


void *funz_invio(void *socket){
int sock= *(int*) socket;
while(){... send(sock, )..}
}

void *funz_ricevo(void *socket){
int sock= *(int*) socket;
while(){... recv(sock, ) ..}
}

}

lo stesso nella parte client ho due thread uno per ricever e uno per inviare praticamente speculari.

cosa succede:
il client si connette (e scrive e riceve con il server) //tutto ok!
il client2 si connette (e scrive al server.. ) // tutto ok!

il problema è che se il server scrive... riceve solo il client1 e non il client2
come è possibile? dove sbaglio?:muro:

grazie a tutti quelli che mi daranno una mano!+

lorenzo001
13-03-2014, 09:11
Tanto per cominciare perché con questa

new_client=malloc(1);

allochi "un byte" ? Che ci fai con un byte?

skipper_87
13-03-2014, 10:33
Tanto per cominciare perché con questa

new_client=malloc(1);

allochi "un byte" ? Che ci fai con un byte?

Si è vero, era per usarlo nella funzione del thread, ho visto che non cambia nulla se uso direttamente new_client=clientfd, senza il malloc.
L'ho corretto dopo.

Però il problema sta altrove..

Oceans11
13-03-2014, 16:04
così su due piedi credo che il problema stia nella logica
tu dovresti creare un thread per client, non un thread per invio ed uno per ricezione.

skipper_87
13-03-2014, 21:00
così su due piedi credo che il problema stia nella logica
tu dovresti creare un thread per client, non un thread per invio ed uno per ricezione.

esattamente.. è quello che fa il while no?
Aspetto.. quando un client chiede di connettersi lo accetto.. e per ogni client che accetto apro due thread.. uno per inviare e uno per ricevere...
Io l'avevo pensata cosi...