PDA

View Full Version : [Visual C++ 2008 Express Edition] problemi con recv


Prince_81
05-03-2009, 09:16
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) ?

fero86
05-03-2009, 09:42
gestisci ogni connessione su un thread separato.

Prince_81
05-03-2009, 09:58
sapresti indicarmi una guida su cui potrei imparare a creare un thread

fero86
05-03-2009, 12:19
http://msdn.microsoft.com/en-us/library/ms682584(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms684841(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms681917(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms684254(VS.85).aspx

e via dicendo

Prince_81
05-03-2009, 17:00
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 CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) thread, (LPVOID) clientsd, 0, NULL);

che invia il client in questa parte del 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);
}
}

Adesso però ho un altro problema, quando uno dei client invia il messaggio arriva a destinazione, poi in seguito quando il secondo client cerca di inviare un messaggio succede una cosa strana, arrivato verso la riga clientsd=ptr->sd; il programma ritorna indietro come se ci fosse una sorta di ricorsione in sospeso.

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

Prince_81
05-03-2009, 19:08
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?

Prince_81
06-03-2009, 10:22
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?