|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: May 2008
Messaggi: 412
|
[Visual C++ 2008 Express Edition] problemi con recv
ho creato un server a cui si collegano due client con lo scopo di creare una sorta di chat che non abbia molte pretese, il problema è che essendo la funzione recv bloccante se per esempio ho scritto prima la recv che accetta messaggi dal primo client ma il messaggio mi viene mandato per prima dal secondo client ecco che il server rimarrà sempre in attesa perchè attende per primo il messggio dal primo client. Allora la mia domanda è come faccio a permettere al server di accettare messaggi indipendentemente da chi lo invia per prima (che sia il primo o il secondo client) ?
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
gestisci ogni connessione su un thread separato.
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: May 2008
Messaggi: 412
|
sapresti indicarmi una guida su cui potrei imparare a creare un thread
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: May 2008
Messaggi: 412
|
sono riuscito a creare un server che gestisce più client, in poche parole un client invia al server un messaggio da inviare al client destinatario, all'inizio del messaggio c'è il codice del client destinatario.
Uso la funzione CreateThread in questo modo Codice:
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) thread, (LPVOID) clientsd, 0, NULL); Codice:
void thread(int clientsd){ char buffer[256]; char id_dest[4]; struct lista_client *ptr; ptr=calloc(1,sizeof(struct lista_client)); while(recv(clientsd, buffer, 255, 0) > 0){ ptr=head; strncpy(id_dest,buffer,4); //prelevo dalla parte iniziale del messaggio il codice del client destinatario id_dest[4]='\0'; //cerco il client destinatario while(ptr->id_utente != atoi(id_dest) && ptr != NULL){ ptr=ptr->next; } clientsd=ptr->sd; //invio il messaggio al destinatario send(clientsd, buffer, 255, 0); } } Codice:
clientsd=ptr->sd; Quando si usa un thread a fianco del titolo della function il compilatore mette una sorta di logo che indica la posizione del thread, è proprio questo logo che si sposta quando il secondo client cerca di inviare il messaggio e non capisco perchè. Forse non sono stato chiaro ma spero mi possiate aiutare. PS. il codice è un po rozzo ma a me interessa il comportamento del thread. Grazie Ultima modifica di Prince_81 : 06-03-2009 alle 09:46. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: May 2008
Messaggi: 412
|
quando avviene questa sorta di ricorsione compare sul bordo sinistro del compilatore visual studio un pallino blu e quando ci poso su il mouse compare la scritta il processo o il thread è cambiato dall'ultima istruzione cosa vuol dire?
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: May 2008
Messaggi: 412
|
ho letto che createthread crea un thread con un proprio stack, forse è la condivisione di tale stack fra i vari client che crea questo problema, si può fare in modo che ogni client usufruisca di uno stack separato?
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:02.