2016-04-18 1 views
1

Je cherche comment recevoir des données binaires d'une requête HTTP avec la fonction recv de l'API winsock.comment recevoir des données binaires à partir de la fonction recv winsock

Je n'ai aucun problème avec std :: string et string.append() mais mon programme n'a pas besoin de dépendance.

Quelqu'un sait-il comment obtenir le même résultat avec les tampons char *?

do { 
     iRecv = recv(m_socket, recvBuffer, MAX_BUFFER, 0); 

     if (iRecv > 0) 
     { 

     //Need to override std::string with pure WINAPI 
     response.append(recvBuffer, iRecv); 

     iResponseLength += iRecv; 
     xZeroMemory(recvBuffer, MAX_BUFFER); 

     } 
    } while(iRecv > 0); 
+1

'std :: string' est bien capable de contenir des données binaires, cependant vous pourriez trouver l'utilisation' std :: vector 'plus pratique. –

Répondre

0

Il n'y a aucune raison de ne PAS utiliser les conteneurs STL, car ils sont au cœur de C++, ils seront donc disponibles dans tous les compilateurs C++.

Mais, pour répondre à votre question, si vous besoin de les éviter pour une raison quelconque, vous pouvez faire quelque chose comme ceci:

int iResponseCapacity = MAX_BUFFER*5; 
int iResponseLength = 0; 
char *response = new char[iResponseCapacity]; 

do 
{ 
     iRecv = recv(m_socket, recvBuffer, MAX_BUFFER, 0); 
     if (iRecv <= 0) break; 

     if ((iResponseLength + iRecv) > iResponseCapacity) 
     { 
      int iNewCapacity = iResponseCapacity + (MAX_BUFFER*5); 
      char *newResponse = new char[iNewCapacity]; 
      memcpy(newResponse, response, iResponseLength); 
      delete[] response; 
      response = newResponse; 
      iResponseCapacity = iNewCapacity; 
     } 

     memcpy(&response[iResponseLength], recvBuffer, iRecv); 
     iResponseLength += iRecv; 
} 
while (true); 

//... 

delete[] response; 

La clé est de réallouer le response tampon à chaque fois qu'il se remplit à sa capacité maximale. Conteneurs STL comme std::string et std::vector gérer cela intérieurement pour vous. Il existe de nombreux algorithmes disponibles pour calculer des incréments de croissance efficaces lors de la réaffectation pour optimiser les performances et l'utilisation de la mémoire, ce qui précède n'est qu'un exemple simple pour démontrer l'idée.

+0

Merci beaucoup cette solution fonctionne comme je veux – Ett

3
int bytesRead, iRecv; 
char recvBuffer[MAX_BUFFER]; 

bytesRead = 0; 
do { 
    iRecv = recv(m_socket, recvBuffer + bytesRead, MAX_BUFFER - bytesRead, 0); 
    if (iRecv > 0) 
    bytesRead += iRecv; 
} while ((iRecv > 0) && (bytesRead < MAX_BUFFER)); 

Lorsque la boucle ne se termine: bytesRead contient le nombre d'octets lus et les données sont en recvBuffer. Si iRecv est zéro, la connexion était normalement fermée. Si iRecv est inférieur à zéro, une erreur s'est produite. Si iRecv est supérieur à zéro, le tampon est plein.

+0

Merci, mais je ne reçois pas mes données complètement Je reçois seulement la valeur de MAX_BUFFER. Je pense que je dois copier le contenu de recvBuffer tout en augmentant dynamiquement la taille du récepteur. ? – Ett

+0

@Ett Appelez ce code autant de fois que nécessaire. Ou faites le tampon plus grand. –