HTTP response lesen, wie?



  • hallo ihr, ich benutze (in etwa) folgenden code zum senden von http requests:

    int InternetSendRequest(String Message)
    {
      this->hiRequestHandle = HttpOpenRequest(this->hiSessionHandle, "GET", Message, "HTTP/1.0", NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, NULL);
      if(this->hiRequestHandle == NULL)
      {
      	// Fehlermeldung ausgeben.
        return -1;
      }
      else
      {
        if(HttpSendRequest(this->hiRequestHandle, NULL, 0, NULL, 0))
        {
    	    // HttpSendRequest() successful.
    	  	return 0;
        }
        else
        {
        	// Fehlermeldung ausgeben.
          return -1;
        }
      }
    }
    

    das requests senden klappt auch soweit (wenn ich mit ethereal mitsniffe was übers netz geht kommt der request an und auch die passende antwort vom server), nun würde ich aber gerne auch die daten (oder statusmeldungen des webservers) einlesen die dann letzendlich zurückgeschickt werden.

    ich habe schon einiges probiert, bin aber nicht recht schlau aus der msdn geworden.

    mein versuch bis jetzt:

    int InternetReceiveReply(int Buffersize)
    {
    DWORD dwAvailableBytes;
      LPDWORD lpdwBytesRead;
    
      LPVOID lpvBuffer;
    
    	do
      {
      	InternetReadFile(this->hiRequestHandle, lpvBuffer, Buffersize, lpdwBytesRead);
        // Text ausgeben
      }
      while(lpdwBytesRead != 0);
    }
    

    funktioniert nicht wirklich 😞 ich lese angeblich immer nur 0 byte ein.
    in der msdn steht man sollte nach dem request senden HttpEndRequest() aufrufen, jdoch nur wenn man HttpSendRequestEx() verwendet. ich hab es mit und ohne aufruf probiert, ohne erfolg.

    kann mir bitte jemand hilfestellung geben?

    danke euch schonmal jetzt für die bemühungen.

    gruss, root2



  • MSDN schrieb:

    BOOL InternetReadFile(
      HINTERNET hFile,
      LPVOID lpBuffer,
      DWORD dwNumberOfBytesToRead,
      LPDWORD lpdwNumberOfBytesRead
    );
    
    Parameters
    
    hFile
        [in] Handle returned from a previous call to InternetOpenUrl, FtpOpenFile, GopherOpenFile, or HttpOpenRequest.
    lpBuffer
        [out] Pointer to a buffer that receives the data.
    dwNumberOfBytesToRead
        [in] Number of bytes to be read.
    lpdwNumberOfBytesRead
        [out] Pointer to a variable that receives the number of bytes read. InternetReadFile sets this value to zero before doing any work or error checking.
    

    deine InternetReceiveReply() müsste also folgendermassen aussehen

    int InternetReceiveReply(int Buffersize)
    {
      DWORD dwBytesRead;
    
      LPVOID lpvBuffer = malloc(Buffersize);
        do
      {
          InternetReadFile(this->hiRequestHandle, lpvBuffer, Buffersize, &dwBytesRead);
        // Text ausgeben
      }
      while(dwBytesRead != 0);
    free (lpvBuffer);
    }
    

    Kurt



  • danke erstmal für die hilfe.

    jedoch klappt es immernoch nicht wie es sollte.
    ich hab deinen code mal etwas erweitert und lasse mir die gelesenen bytes mit

    printf("read byte: %i\n", dwBytesRead);
    

    auf die konsole anzeigen. mit dem resultat das ich immernoch nur 0 byte lese.

    muss ich evtl. trotzdem noch etwas zwischen den aufrufen von InternetSendRequest() und InternetReceiveReply() machen oder liegt das problem ganz woanders?

    danke und einen schönen sonntagabend.

    root2



  • Der Debugger ist dein Freund.
    K



  • hallo nochmal.

    ich hab den fehler gefunden, er lag schon eine stufe vorher.

    ich hatte InternetOpen() wie folgt aufgerufen:

    this->hiRootHandle = InternetOpen("r2", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, INTERNET_FLAG_ASYNC);
    

    und nachdem er dann nur asynchrone requests macht hat das so nicht hingehauen. der aufruf jetzt schaut so aus:

    this->hiRootHandle = InternetOpen("r2", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    

    und da klappt alles wie es soll.

    gruss, root2


Anmelden zum Antworten