2010-01-08 4 views
1

Je suis la programmation d'un serveur de socket très simple suivant this sample code. Le serveur est opérationnel et je peux me connecter via telnet (en utilisant Putty, en fait). Chaque fois qu'une nouvelle connexion est reçue, je Spawn un nouveau thread qui est le code suivant:C programmation Winsock: ordures d'entrée

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 le connecte imprime ce charabia:

alt text

Si je entrée « bonjour » puis "stackoverflow" dans le client, ce que je reçois:

alt text

Même si je déclarais explici A la fin de la ligne '\ 0', il semble prendre beaucoup plus de la ligne, plus je ne sais pas pourquoi il imprime l'entrée deux fois, le second étant le premier moins le premier ou les deux premiers caractères.

Une aide pour comprendre ce qui se passe? Merci d'avance.

EDIT: révisée en conséquence à ce que suggéré par dérouleur

Répondre

3

Vous devriez faire mieux la vérification des erreurs et la manipulation de tampon plus sensible:

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 un espace dans la mémoire tampon pour la terminaison, de sorte que vous pouvez » t 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.

+0

Salut! merci beaucoup, je me rapproche beaucoup plus maintenant. Dès que je me connecte je reçois toujours "Got " et le problème de double entrée, le second étant un "\ n", je suppose que – pistacchio

+0

Quelle est la valeur de 'res'? –

+0

@Alok: la page de manuel pour recv dit: "recv() renvoie le nombre d'octets reçus, ou -1 si une erreur s'est produite" (légèrement paraphrasé pour la grammaire). – unwind

0

Je suppose que recv() retourne "-1" (erreur signifie).

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

+0

hi! J'ai essayé et il ne retourne aucune erreur. – pistacchio