2010-05-03 7 views
0

on me donne la déclaration suivante:question de programmation Socket

char inbuff[500], *ptr; 

int n, bufferlen; 

Ecrire un segement programme pour recevoir un message ayant 500 bits de la chaussette de socket TCP et stocker ce message dans inbuff.

Ma réponse est:

n = recv(sock, inbuff, strlen(inbuff), 0); 

Cependant, je ne sais pas pourquoi * ptr est donnée dans la déclaration.

Donc, je voudrais demander, quel est le but du pointeur dans cette question ??

Ou mon segment de programme est faux?

Merci d'avance de votre aide!

+0

Je pense qu'au lieu de sizeof il peut utiliser l'int bufferlen fourni. – jonathanasdf

+2

L'utilisation de 'strlen' est presque certainement fausse, d'autant plus que vous avez une variable' bufferlen' qui, vraisemblablement, contient la longueur du buffer. –

+0

Merci pour tous vos commentaires. Ces avis sont vraiment utiles pour bien apprendre dans la programmation socket. Merci! – dfddf

Répondre

0

Votre fragment de code a quelques erreurs. Comme James l'a mentionné, vous avez besoin de sizeof, pas de strlen pour obtenir la taille de votre tampon. Mais plus important encore, recv ne fonctionne pas tout à fait comme vous le pensez. Assurez-vous de comprendre exactement quelles garanties cela apporte.

+0

Désolé, j'ai changé mon commentaire juste avant de poster ceci. Il veut vraiment utiliser 'bufferlen'; Je n'ai pas vu qu'il avait cette variable jusqu'à ce que j'ai formaté son code. –

1

recv peut renvoyer moins de données que vous avez demandé, si la quantité de données demandée n'est pas encore arrivée (la valeur de retour est le montant exact reçu) - vous devez donc mettre le programme en boucle, et utiliser p pour pointer vers l'emplacement suivant pour plus de données, jusqu'à ce que vous remplissiez le tampon.

Dans Linux, il y a un drapeau MSG_WAITALL qui tente de limiter ce comportement, mais il est pas parfait:

MSG_WAITALL (since Linux 2.2) 
      This flag requests that the operation block until the full 
      request is satisfied. However, the call may still return less 
      data than requested if a signal is caught, an error or discon‐ 
      nect occurs, or the next data to be received is of a different 
      type than that returned. 
+0

recv ne demande pas réellement une quantité spécifique de données - il donne juste la taille du tampon. – kyoryu

+0

@kyoryu: Je suppose que c'est une meilleure façon d'y penser. –

0

Le PTR est probablement pas utile, mais je voudrais utiliser n = recv(sock, inbuff, 500, 0); parce strlen(inbuff); ne sera pas nécessairement 500 ;

+0

ptr est nécessaire ... voir la réponse de Ken Bloom pour savoir pourquoi. OTOH, vous avez raison sur strlen. Donc, +1 et -1 ... Je suppose que ça balance :) – kyoryu