Wininet.h unter Vista64 kompiliert - unter XP seltsam

Plurax

Grünschnabel
Hi Community!

Ich entwickle einen kleinen POST Datensender.

Das Entwicklungssystem ist Vista64 mit VC2008.

Die Wininet läuft einwandfrei auf dem Testsystem, sowohl Debug als auch Release.

Unter XP läuft zwar das Programm, die Postdaten werden aber irgendwie anders verschickt, so dass mein PHP script einen bad request als Antwort sendet (hab ich im Wireshark gesehen).

Gibt es eine Möglichkeit die wininet lib mit zuliefern oder muss ich noch irgendwelche Kompatibilidingsda-Einstellungen vornehmen? Ich habe in der targetver.h beide Versionsnummern in 0x0501 geändert und static linking aktiviert (nach dem ich den "falsch konfiguriert..." Fehler bekam...)

Danke schon mal...

Gruß
Plurax
 
Hi.

Der Fehler liegt mit ziemlicher Sicherheit in deinem Code. Die Bibliothek ist unter Windows XP bestimmt in Ordnung.

Hast du Network Byteorder und Host Byteorder beachtet? Wie unterscheiden sich die Daten wenn du sie verschickst?

Gruß
 
Entweder er sendet gar keine Daten, oder die Daten sind verkorkst.
D.h. im Apptype steht nicht das typische
"Content-Type: application/x-www-form-urlencoded"
Sondern der Wireshark schreibt nur POST. Mehr nicht.

Ich muss dazu sagen das ich die APP mit UNICODEFLAG kompiliere und alle Texte mit dem notwendigen TEXT() Makro erzeuge (also auch den Contenttype bspw.).

Die von mir gebastelte URL encoding Funktion arbeitet mit wctomb_s und wirft alles was kein valid char ist weg. Das sollte für den Anfang reichen. Aber auch dort passiert Unfug, die POST Daten sind im Wireshark alle als Zahlen aufgelöst. Auf der rechten Seite ist jedoch der content in SCAII korrekt.

Ich prüfe in dem Script auf eine bestimmte Postvariable, diese ist nicht gesetzt.

Ganz merkwürdig ist, das mein Bruder in einem XP in einer VM mit SP3 problemlos senden konnte. Daraufhin hab ich SP3 installiert aber es geht trotzdem nicht.

Gruß
Plurax

€: Die Byteorder hab ich mir nicht angeschaut, hab das Sample aus irgendeinem Forum (vielleicht sogar von hier). Was muss ich da beachten?
€²: Hab noch was vergessen, ich benutze nicht die Vollversion sondern die Express Edition, deswegen musste ich die GUI mit Api32 zusammenschnitzen und einen kostenlosen Resedit nehmen.
 
Zuletzt bearbeitet:
Entweder er sendet gar keine Daten, oder die Daten sind verkorkst.
D.h. im Apptype steht nicht das typische
"Content-Type: application/x-www-form-urlencoded"
Sondern der Wireshark schreibt nur POST. Mehr nicht.
Scheint als wäre deine Berechnung der Datenlänge nicht korrekt? Zeig deinen Code.

Ich muss dazu sagen das ich die APP mit UNICODEFLAG kompiliere und alle Texte mit dem notwendigen TEXT() Makro erzeuge (also auch den Contenttype bspw.).
Wie sieht's aus wenn du kein _UNICODE definierst?
€: Die Byteorder hab ich mir nicht angeschaut, hab das Sample aus irgendeinem Forum (vielleicht sogar von hier). Was muss ich da beachten?
Siehe http://de.wikipedia.org/wiki/Byte-Reihenfolge
€²: Hab noch was vergessen, ich benutze nicht die Vollversion sondern die Express Edition, deswegen musste ich die GUI mit Api32 zusammenschnitzen und einen kostenlosen Resedit nehmen.
Und wozu genau?

Zeig einfach den entsprechenden Code.

Gruß
 
Das Problem liegt in der maximalen Paketgrösse.
Abhängig von Betriebssystem und Provider werden Daten in Pakete geteilt, sobald sie mehr als x Byte gross sind.
Liest der Empfänger nur ein Paket, kommt Murks raus.
Darum muss man auch in WinInet Daten in einer Schleife lesen, z.B. so:

Code:
stringstream CompleteBuffer;
         do{
             char antwortbuffer[1000];
             InternetReadFile(request, antwortbuffer, sizeof antwortbuffer, &len);
             antwortbuffer[len] = '\0';
             CompleteBuffer << antwortbuffer;
           } while(len);
string CompleteAnswer = CompleteBuffer.str();
 
@ Thomasio
Momentan sende ich nur, kann es sein das der Inputbuffer überläuft weil ich ihn nicht auslese?

@ deepthroat
Hier wandel ich wstring in urlencoded cstring
Das ist alles auf die Schnelle hingeschnitzt, da ich mit der API nicht sehr vertraut habe, wie gesagt keine MFC habe und außerdem fast nur ANSI C verwende.
Code:
void AppendString(wstring *wSTR, string *cSTR)
{
  size_t len = wSTR->length(); // get length
	wchar_t *wcharPtr = (wchar_t*)wSTR->c_str();
	char ASCII[] = "0123456789ABCDEF";
	char c[2]= "0";
	char ct1[2]= "0";
	char ct2[2]= "0";
	char Esc[2] = "%";
	for (size_t Cnt = 0; Cnt < len; Cnt++)
	{
		int ErrCode;
		wctomb_s(&ErrCode, &c[0], (rsize_t)2, *wcharPtr++);
		if ((((int)c[0] & 0xFF) > 0x20) &&
	    	(((((int)c[0] & 0xFF) >= ((int)0x41)) &&
				(((int)c[0] & 0xFF) <= ((int)0x5A))) ||
				((((int)c[0] & 0xFF) >= ((int)0x61)) &&
				(((int)c[0] & 0xFF) <= ((int)0x7A))) ||
				((((int)c[0] & 0xFF) >= ((int)0x30)) &&
				(((int)c[0] & 0xFF) <= ((int)0x39)))))
		{
			cSTR->append(c, 1); // append one char
		}
		else
		{
			cSTR->append(Esc, 1); // append escape char
			ct1[0] = ASCII[((int)c[0] >> 4) & 0x0F];
			cSTR->append(ct1, 1); // append one char
			ct2[0] = ASCII[(int)c[0] & 0x0F];
			cSTR->append(ct2, 1); // append one char
		}
	}
}

Das sind die beiden wichtigsten Funktionen aus der Posterklasse.

Code:
	void CNetPoster::Connect()
	{
		HConnection = InternetOpen(TEXT("My App"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
	}

	void CNetPoster::Send()
	{
      if (HConnection != NULL)
      {

        // close any valid internet-handles
        unsigned long flags     = INTERNET_FLAG_PRAGMA_NOCACHE;

        connection = InternetConnect(   HConnection,
        (LPCWSTR)wstrHost->c_str(),  // Host
        INTERNET_DEFAULT_HTTP_PORT, // PORT
        NULL, //String
        NULL,  //String
        INTERNET_SERVICE_HTTP,
        0, 1);

        if (connection != NULL)
        {
          request = HttpOpenRequest(     connection,
          (LPCWSTR)postMethod->c_str(),
          (LPCWSTR)wstrURL->c_str(), //Pfad
          NULL,       //HTTP standard Version
          NULL,      //keine Referenz
          NULL,//&TypePtr,
          flags,1);
      }

      HttpSendRequest( request,
                        TEXT("Content-Type: application/x-www-form-urlencoded"),
                        -1L,
                        (LPVOID)cstrPostData->c_str(),
                        (DWORD)cstrPostData->length());

      cstrPostData->clear();
    }
  }

       void CNetPoster::AddValue(wstring *ValName, wstring *Value)
	{
		AppendString(ValName, cstrPostData);
		cstrPostData->append("=", 1);
		AppendString(Value, cstrPostData);
		cstrPostData->append("&", 1);
	}

Die Postdaten werden mit dem Addvalue angehangen.
Wie gesagt, unter Vista funktioniert das einwandfrei oO
Oder ich hab ein Memleak und merk es nicht da ich hier 4G ram hab und auf den XP Kisten wo ich es verwenden will nicht.

Der Nachteil ist das ich hier kein XP zum Testen habe...

Vielen Dank für die Geduld :D
 
Ich hab mir ein Dummyprojekt neu erstellt und die Configs kopiert. In dem alten Projekt habe ich es irgendwie geschafft Debug und Release zusammenzulegen.

Nun bekomme ich keinen Compilerfehler mehr, und ich kann die App ohne das ich static linking aktiviert habe auf der XP Kiste ausführen.

Trotzdem sendet er nicht.
Ich hab nun erst mal den Handle in die Subklasse gegeben und erzeuge bei jedem Connect bei einem Fehlschlag eine ErrorMessage.
Außerdem schieb ich die Antwort auf den Request in ein Textfile...

Das kann doch ned so schwer sein...
 
Für die die es interessiert:

Auf dem Zielsystem war der Internet Explorer steinalt. So auch die Lib. Deswegen hat er manchmal mit gespielt und andermal wieder nicht.

Nachdem ich den IE auf Version 8 updated habe funktioniert es nun wunderbar...

Danke trotzdem für eure Geduld...
So long...
PLurax...
 
Zurück