2010-08-10 4 views
2

J'utilise des sockets avec C++. Le programme demande simplement une page HTTP, le lit dans un tampon buf[512], puis affiche le tampon. Cependant, les pages peuvent contenir plus de données que le tampon, il sera donc coupé s'il n'y a plus d'espace disponible. Je peux augmenter la taille de la mémoire tampon, mais cela ne semble pas être une bonne solution. Voici le code que j'utilise:Que dois-je utiliser comme tampon en C++ pour recevoir des données de sockets réseau?

char buf[512]; 
int byte_count = recv(sockfd, buf, sizeof(buf), 0); 

Quelle serait une alternative à un tableau de caractères en C++ pour l'utiliser comme un tampon?

+1

Puisqu'il s'agit d'une requête HTTP, la taille de la page peut être contenue dans les informations d'en-tête. Si vous pouvez récupérer que vous pouvez dynamiquement allouer de la mémoire (utilisez std :: vector ) pour contenir toute la page. Notez simplement que le serveur Web envoyé 200 octets ne signifie pas que vous les recevrez dans un bloc. Le transport est autorisé à le décomposer en plus petits blocs et vous devez boucler jusqu'à ce que recv() renvoie 0 ou un code d'erreur. –

Répondre

2

dépend de ce que vous avez l'intention de faire avec les données. Si vous voulez simplement le sauvegarder dans un flux de sortie, alors la bonne chose à faire est de faire ce que vous faites, mais faites-le en boucle jusqu'à ce qu'il n'y ait plus de données à lire, en écrivant le tampon dans le flux de sortie après chaque lis.

1

Il n'y en a fondamentalement pas - lorsque vous utilisez recv, vous devez l'appeler plusieurs fois jusqu'à ce qu'il ait lu toutes vos entrées. Vous pouvez bien sûr utiliser des bibliothèques de sockets plus avancées qui supportent les tampons de plus en plus nombreux, mais pour un vieux recv(), un tableau n de char (ou vector of char) est ce dont vous avez besoin.

Vous pouvez bien sûr ajouter les données lues dans un tampon dynamique comme une chaîne:

string page; 
while(len = recv(...)) { 
    page.append(buf, len); 
} 
Questions connexes