C Programmation Winsock: entrave à la saisie

Je programme un serveur de socket très simple en suivant cet exemple de code . Le serveur est opérationnel et je peux me connecter via telnet (avec Putty, en fait). Chaque fois qu’une nouvelle connexion est reçue, je génère un nouveau thread qui est le code suivant:

DWORD WINAPI receive_cmds(LPVOID lpParam) { char outbuffer[100]; outbuffer[0] = '\0'; char inbuffer[100]; inbuffer[0] = '\0'; int res; SOCKET current_client = (SOCKET)lpParam; while (1) { res = recv(current_client, inbuffer, sizeof inbuffer - 1, 0); if (res > 0) { inbuffer[res] = '\0'; printf("Got '%s'\n", inbuffer); } Sleep(10); if (res == 0) { closesocket(current_client); ExitThread(0); } //printf("%s\n", inbuffer); strcpy(inbuffer, ""); } } 

Dès que je me connecte, il imprime ce charabia:

texte alternatif

Si je saisis “bonjour” puis “stackoverflow” dans le client, voici ce que je reçois:

texte alternatif

Même si j’ai déclaré explicitement la fin de la ligne ‘\ 0’, cela semble prendre beaucoup plus de la ligne, et je ne sais pas pourquoi elle imprime l’entrée deux fois, la seconde étant la première moins les deux premières personnages.

Toute aide pour comprendre ce qui se passe? Merci d’avance.

EDIT: édité en conséquence sur ce que suggère dérouler

Vous devriez mieux vérifier les erreurs et mieux gérer les tampons:

 res = recv(current_client, inbuffer, sizeof(inbuffer), 0); 

devrait être

 res = recv(current_client, inbuffer, sizeof inbuffer - 1, 0); if (res > 0) { inbuffer[res] = '\0'; printf("Got '%s'\n", inbuffer); } 

Vous devez laisser de l’espace dans la mémoire tampon pour le terminateur, de sorte que vous ne pouvez pas utiliser tout le tampon pour recevoir des données. Et vous devriez vérifier -1 et terminer le tampon pour en faire une chaîne avant de l’imprimer en tant que tel.

Je suppose que recv () renvoie “-1” (ce qui signifie erreur).

Je devrais voir le rest de votre code pour deviner pourquoi. Essayez de tester un retour de -1, puis appelez WSAGetLastError () pour connaître la raison de l’erreur.