PDA

Visualizza la versione completa : [C] Socket Multi-Client/Server


skipper87
13-03-2014, 10:07
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); // credo che non servano, basta poi cambiare
*new_client=clientfd; // l'argomento del thread con clientfd

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

}//fine while

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?http://www.hwupgrade.it/forum/images_hwu/smilies/icon_dho.gif

grazie a tutti quelli che mi daranno una mano!+

oregon
13-03-2014, 10:31
Queste righe

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

cosa dovrebbero fare?

skipper87
13-03-2014, 10:58
Queste righe

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

cosa dovrebbero fare?

pensavo per allorare una porzione diversa per clientfd, ma mi sa tanto di cosa inutile.. però non incide sul programma... quindi il problema è altrove..

oregon
13-03-2014, 11:34
Intanto con quelle righe stai "sporcando" la memoria perché allochi un solo byte e ci scrivi clientfd che occupa più spazio.
Questo tipo di operazioni è "imprevedibile" e potrebbe causare di tutto al tuo programma. Considerando che lo passi ai nuovi thread ci starei molto attento.

In più, le funzioni si chiamano funz_invio e funz_ricevo ma tu passi l'indirizzo di invio e ricevo (?) ...

skipper87
13-03-2014, 11:38
Intanto con quelle righe stai "sporcando" la memoria perché allochi un solo byte e ci scrivi clientfd che occupa più spazio.
Questo tipo di operazioni è "imprevedibile" e potrebbe causare di tutto al tuo programma. Considerando che lo passi ai nuovi thread ci starei molto attento.

In più, le funzioni si chiamano funz_invio e funz_ricevo ma tu passi l'indirizzo di invio e ricevo (?) ...

Intendi come argomento della funzione?
questo perchè il thread come argomento della funzione chiede una (void*) e a me serve comunicare alla funzione la socket del server. o no?

oregon
13-03-2014, 12:01
Non ci siamo capiti ...

Tu passi l'indirizzo di invio

&invio

ma la funzione si chiama

funz_invio

skipper87
13-03-2014, 12:09
Non ci siamo capiti ...

Tu passi l'indirizzo di invio

&invio

ma la funzione si chiama

funz_invio

funz_invio è la funzione eseguita dal thread creato, invio è il tid del thread..

la struttura della creazione del thread è:
int pthread_create(thread_t *tidp, phread_attr_t *attr, void* (*funzione), void* arg);
Mi pare sia corretta...

oregon
13-03-2014, 12:15
Corretto ... ma questa linea

clientfd=accept(serverfd,);

sembra incompleta

Guarda questo esempio

https://gist.github.com/silv3rm00n/5821760

skipper87
13-03-2014, 12:22
Si, perchè ho scritto a spanne, ma è corretto l'accept completo.
clientfd = accept(serverfd, (struct sockaddr *)&client_addr, (socklen_t*)&c)si ho visto l'esampio su https://gist.github.com/silv3rm00n/5821760

ed infatti è corretto. Coincide perfettamente; la sua funzione connection handler coincide con la mia funzione funz_ricevo.

Infatti si connettono tutti i client che voglio e tutti riescono ad inviare al server e il server riceve tutto.
Il problema è che il server scrive solo ad un client e non a tutti, è qui il focus del problema.

Loading