2016-04-03 12 views
-1

Ich schreibe eine Konsolenanwendung in C++, die Sockets und senden Sie eine HTTP GET Anforderung an einen Server, aber die Antwort ist eine html Datei größer als 1000000 infact meiner Puffer: char buffer[1000000]; ist zu klein. Ich muss größere Daten vom Server erhalten als die Größe des Puffers.Wie empfangen große Daten mit recv() -Funktion mit C++?

Ich benutze diesen Code, aber was ist der Weg, um eine größere Antwort zu erhalten? Ich bin ein Anfänger in diesem Programmbereich so helfen Sie mir bitte mit Code und explenations Dank:

char buffer[1000000]; 


    int nDataLength; 
    while ((nDataLength = recv(Socket, buffer, 1000000, 0)) > 0) { 
     int i = 0; 

     while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') { 
      myString += buffer[i]; 
      i += 1; 
     } 
    } 

    cout << myString << "\n"; 
+1

Verwenden Sie einen größeren Puffer .... – jpo38

+0

@ jpo38 yep aber 1000000 ist die maximale Größe für eine char-Array erlaubt –

+0

Was 'recv' kehrt? Eine Zahl oder 'SOCKET_ERROR' (-1). Kleiner Puffer sollte kein Problem sein, Sie sollten eine Teilantwort für jeden Anruf zu "recv" lesen und am Ende alle Daten erhalten, die irgendwann empfangen werden. Bitte setzen Sie 'cout <<" recv gab "<< nDataLength << endl 'innerhalb Ihrer Schleife zurück, um zu sehen, ob Sie einige Daten erhalten haben oder nicht. – jpo38

Antwort

2

Sie müssen beim Lesen aus dem Socket einen kleineren Puffer mit fester Länge verwenden und dann die gelesenen Daten bei jeder Schleifeniteration an einen dynamisch wachsenden Puffer (wie eine std :: string oder eine Datei) anhängen. recv() sagt Ihnen, wie viele Bytes tatsächlich gelesen wurden, nicht mehr als diese viele Bytes beim Zugriff auf den Puffer zugreifen.

char buffer[1024]; 
std::string myString; 

int nDataLength; 
while ((nDataLength = recv(Socket, buffer, sizeof(buffer), 0)) > 0) { 
    myString.append(buffer, nDataLength); 
} 

std::cout << myString << "\n"; 
+0

dank Ihrer Hilfe .. es funktioniert richtig –

1

recv Rückgabewert Gesamtgröße von receved Daten vorhanden ist. so können Sie die Gesamtdatengröße kennen, wenn Ihr Puffer kleiner als die Gesamtdatengröße ist, gibt es 2 Lösungen. Ich denke ... 1. Zuweisen von Puffer auf dem Heap. Verwenden Sie wie neu, allcoc usw. 2. speichern Sie empfangene Daten in Datenstruktur (wie zirkuläre Warteschlange, Warteschlange), während Tatal Datengröße ist Null (recv Funktion zurück)

Ich bevorzuge zweite Lösung zu verwenden. Googeln über recv Funktion, Socket Programmierung von Beispielcodes. Das wird hilfreich sein.

+0

so wie kann ich meinen Code ändern? @KimRyunghi –