2011-02-03 3 views
0

Quelqu'un peut-il trouver un problème dans cette fonction? Mon application fait plusieurs demandes et si la première demande utilise SSL, l'application se bloque sur certains ordinateurs (sur le mien 4 ordinateurs + vmware ça marche bien sans crash).Problème avec wininet C++

Voici le code

char Buffer[1024]; 
DWORD dwRead; 
string data; 

string Request(string method, string host, string file, string headers, 
       string post, bool debug, bool SSL) 
{ 
    HINTERNET hSession, hDownload, hRequest; 
    DWORD flag; 
    DWORD port; 

    data.empty(); 

    //SSL or not + flag :) 
    if (SSL) 
    { 
     port = INTERNET_DEFAULT_HTTPS_PORT; 
     flag = INTERNET_FLAG_SECURE; // FLAG_SECURE 
    } 
    else 
    { 
     port = INTERNET_DEFAULT_HTTP_PORT; 
     flag = INTERNET_FLAG_RELOAD; //FLAG_RELOAD 
    } 

    char * postdata; 
    postdata = new char[post.size() + 1]; 
    strcpy(postdata, post.c_str()); 
    char * headersdata; 
    headersdata = new char[headers.size() + 1]; 
    strcpy(headersdata, headers.c_str()); 

    //Actual request 
    hSession 
      = InternetOpen(
        "Mozilla/5.0 (Windows; U; Windows NT 6.1; sl; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11", 
        INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); 
    if (hSession) 
    { 
     hDownload = InternetConnect(hSession, host.c_str(), port, NULL, NULL, 
       INTERNET_SERVICE_HTTP, 0, 0); 
     if (hDownload) 
     { 
      hRequest = HttpOpenRequest(hDownload, method.c_str(), file.c_str(), 
        "HTTP/1.1", NULL, NULL, flag, 0); 
      if (hRequest) 
      { 
       if (strlen(headersdata) && strlen(postdata)) 
       { 
        HttpSendRequest(hRequest, headersdata, strlen(headersdata), 
          postdata, strlen(postdata)); 
       } 
       else 
       { 
        HttpSendRequest(hRequest, NULL, 0, NULL, 0); 
       } 
      } 
     } 
    } 
    //Writing HTML response in data buffer 
    while (InternetReadFile(hRequest, Buffer, sizeof(Buffer), &dwRead)) 
    { 
     if (dwRead == 0) 
     { 
      break; 
     } 
     Buffer[dwRead] = 0; 
     data += Buffer; 
    } 

    //Debug :) 
    if (debug) 
    { 
     ofstream dbgfile; 
     dbgfile.open("debug.html"); 
     dbgfile << data; 
     dbgfile.close(); 
    } 

    //Close handles 
    InternetCloseHandle(hSession); 
    InternetCloseHandle(hDownload); 
    InternetCloseHandle(hRequest); 

    return data; 
} 

Merci. Tout d'abord, vous avez un débordement de tampon avec Buffer

+0

Quelle erreur est donnée lors de l'incident? Violation d'accès? Un autre code d'erreur? –

+0

erreur est ** Cette application a demandé l'exécution d'y mettre fin d'une manière inhabituelle. ** Dommage qu'il ne se produit pas ici pour que je puisse déboguer :( – pwnu91

+0

vous pouvez essayer le débogage à distance ... – smerlin

Répondre

0

Tenir compte de ces lignes:

while (InternetReadFile(hRequest, Buffer, sizeof(Buffer), &dwRead)) 

et

Buffer[dwRead] = 0; 

Puisque vous passez sizeof(Buffer) comme paramètre dwNumberOfBytesToRead dans l'ancienne ligne, la valeur maximale de dwRead est sizeof(Buffer). Si un tel cas se produit, la dernière ligne écrira un octet après la fin de Buffer. Votre mise en page de données rend peu probable un plantage (mais c'est un pur hasard!), Sauf si vous avez activé les contrôles de sécurité d'exécution, ce qui peut expliquer le message d'erreur. En outre, autant que je me souvienne, le message «Cette application a demandé à l'exécution de terminer de manière inhabituelle» est affiché par assert() ou terminate() dans l'implémentation Microsoft. (Je n'ai pas MSVC disponible pour le moment et je ne peux pas le vérifier). Je ne vois pas la raison de l'un ou de l'autre dans ce morceau de code, donc si ce n'est pas le débordement Buffer, cherchez-le dans d'autres endroits aussi.

+0

Merci de me dire i il fixe :) :) Mais encore, il ne résout pas le problème ... :( Je ne sais pas pourquoi il se bloque seulement sur certaines machines pas sur tous ... – pwnu91

0

Essayez de supprimer strlen:

HttpSendRequest(hRequest, &headers.front(), headers.size(), 
       &post.front(), post.size()); 

Dans ce cas, la fonction sera un peu plus sûr.

Quoi qu'il en soit, pensez à utiliser Crash Dump Analysis. Dans ce cas, vous pourrez vérifier la callstack à partir du vidage sur incident obtenu à partir de 'certains ordinateurs'.