InternetReadFile

Naja, wenn ich deinen geposteten Code / deine while schleife benutze, hab ich das selbe Problem. (Lese halt per sscanf aus) mit deinem Code wird mir auch nur der 1. Wert ausgegeben.
 
Also,

ich lese das ganze jetzt so aus


content.find("Text1=");

funktioniert auch soweit, allerdings werden dann alle strings unterhalb von text1 auch noch ausgelesen. Die darüberliegenden hingegen nicht. Kann ich mit content.find auch zeile für zeile auslesen? also ich möchte ja mehrere strings auslesen, allerdings halt alle einzeln...
 
Internet Verbindungen haben eine recht kleine Package Grösse (meistens ca 1KB) und wenn die übertragenen Daten grösser sind als die Paketgrösse, dann wird das Ganze automatisch in mehrere Pakete aufgeteilt.
WinInet bricht die Verbindung ab, wenn die maximale Paketgrösse erreicht ist, auch wenn im buffer noch reichlich Platz wäre.
Du brauchst ZWEI buffer, und einen loop, der weiter liest, bis keine Daten mehr kommen.

Etwa in dieser Art:

Code:
std::stringstream AllData;
unsigned long len;
do{
char buffer[1024];
InternetReadFile(hUrl, buffer, sizeof buffer, &len);
buffer[len] = '\0';
AllData << buffer;
} while(len);

Wenn du das Ganze dann wieder als PCHAR brauchst, hilft strcopy()
 
Hi Thomasio

ich habe Deinen Teil mit dem stringstream in meine Http-Klasse übernommen:
Code:
if (HttpSendRequest(request, NULL, 0, NULL, 0)) {
	unsigned long len; 
	std::stringstream ssBuffer; 
	do{
		char antwortbuffer[1024];
		InternetReadFile(request, antwortbuffer, sizeof antwortbuffer, &len);
		antwortbuffer[len] = '\0';
		ssBuffer << antwortbuffer;
	} while(len);

	// das folgende ist von mir
	// Ziel ist es, den ssBuffer in eine std::wstring Variable zu kriegen
	std::string stmp;
	std::wstring wstmp;
	stmp = ssBuffer.str();
	wstmp = StringToWString(stmp);
	std::cout << "sendRequest(): " << stmp << "EOL" << std::endl;
	std::cout << "sendRequest(): " << strlen(stmp.c_str()) << std::endl;
	std::wcout << "sendRequest(): " << wstmp << "EOL" << std::endl;
	std::wcout << "sendRequest(): " << _tcslen(wstmp.c_str()) << std::endl;

	result = 1;
} else {
	// mach was anders	
}

Die Webseite liefert je nach Request "OK", "FORBIDDEN", "UNAUTHORIZED", "ERROR", ... zurück

Was raus kommt, wenn die Seite "OK" zurückgibt, ist folgendes:
Code:
OKEOLequest():
sendRequest(): 3
OKEOLequest():
sendRequest(): 3


Und ich poste, weil ich das nicht versteh':
- Warum beträgt die Länge 3, wenn doch nur "OK" zurückgegeben wird?
- Warum wird bei "sendRequest():" die ersten 5 Zeichen mit "OKEOL" überschrieben? Ich würde nämlich folgenden Output erwarten: sendRequest(): OKEOL
- Wie krieg ich also nur "OK" in meine stmp, wstmp Variablen?

Denn wenn ich folgendes ausführe:
Code:
void test1() {
	char cBuff[100] = "Hallo Welt";
	std::stringstream ssBuffer; 

	ssBuffer << cBuff;

	std::string s1;
	s1 = ssBuffer.str();

	std::cout << "test1(): " << s1 << "EOL" << std::endl;
	std::cout << "test1(): " << strlen(s1.c_str()) << std::endl;
}
Erhalte ich nämlich:
Code:
test1(): Hallo WeltEOL
test1(): 10
Die Länge entspricht 'wirklich' "Hello World" (10) und EOL wird hinter die std::string Variable geschrieben.

Ich habe versucht mit std::substr() das letzte Zeichen (
Code:
stmp.substr(0, stmp.length() -1)
) abzuschneiden, aber dann erhalte ich nur noch "O" mit der Länge 2.

Also, dass die Konsolenausgabe nicht stimmt, ist mir ja noch egal. aber das zusätzliche Zeichen das nervt mich :)

cheerioh & thx
SiS
 
Zuletzt bearbeitet:
Hi.
Die Webseite liefert je nach Request "OK", "FORBIDDEN", "UNAUTHORIZED", "ERROR", ... zurück

Was raus kommt, wenn die Seite "OK" zurückgibt, ist folgendes:
Code:
OKEOLequest():
sendRequest(): 3
OKEOLequest():
sendRequest(): 3


Und ich poste, weil ich das nicht versteh':
- Warum beträgt die Länge 3, wenn doch nur "OK" zurückgegeben wird?
Weil offenbar ein \r Zeichen mit zurückgegeben wird.
- Warum wird bei "sendRequest():" die ersten 5 Zeichen mit "OKEOL" überschrieben? Ich würde nämlich folgenden Output erwarten: sendRequest(): OKEOL
Weil ein \r Zeichen in dem String ist.

Der Code ist außerdem nicht wirklich günstig. Man sollte sich an die MSDN halten wenn man die Funktionen benutzt und immer den Rückgabewert prüfen. Außerdem könnte es passieren, das du hinter das letzte Arrayelement zugreifst (wenn nämlich 1024 Bytes gelesen werden konnten) und löst damit undefiniertes Verhalten aus.

Und wozu einen std::stringstream verwenden, wenn man eigentlich keine formatierte Ein-/Ausgabe durchführt?
C++:
const DWORD buflen = 1024;
char buf[buflen];
DWORD len;
std::string data;
bool success;

while ((success = InternetReadFile(request, buf, buflen, &len)) && len != 0) {
  data.append(buf, len);
}
if (success) {
  std::cout << "data length: " << data.length() << std::endl;
} else {
  // Fehler, GetLastError() etc.
}
Ich habe versucht mit std::substr() das letzte Zeichen (
Code:

stmp.substr(0, stmp.length() -1)

) abzuschneiden, aber dann erhalte ich nur noch "O" mit der Länge 2.
Das \r Zeichen ist das erste Zeichen im String, du müßtest also das erste Zeichen entfernen (oder den Server dazu bringen die Antworten zu liefern, die du erwartest).

Gruß
 
Zuletzt bearbeitet:
Ich lach mich schief!

War ja schon spät (Büro) bei meinem letzten Post. Eigentlich hätte mir die Antwort beim Abzwacken des letzten Zeichens selber in den Sinn kommen. Tatsächlich wird von der Appli \r zurückgeliefert. Die bestehenden Clients "säubern" den Response, weswegen dies bisher niemandem aufgefallen ist. Habe dann den Hersteller informiert: Anwort: Ist bekannt, aber bisher gabs keine Probleme und somit auch keinen Patch :)

Thx deep.

Man sollte sich an die MSDN halten wenn man die Funktionen benutzt und immer den Rückgabewert prüfen
Da hast Du recht und danke für den Hinweis. der Code war nur ein Gebastel (C++ Euphorie hatTE mich gepackt).

cheerioh & Thx euch allen
SiS
 
Zurück