2011-02-03 65 views
0

任何人都可以在這個函數中找到問題嗎? 我的應用程序提出了幾個請求,如果第一個請求使用SSL,某些計算機上的應用程序崩潰(在我的4臺計算機+ vmware上它可以正常運行而不會崩潰)。Wininet C++的問題

這裏是代碼

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; 
} 

感謝。

+0

發生崩潰時發生了什麼錯誤?訪問違規?其他一些錯誤代碼? – 2011-02-03 10:49:10

+0

錯誤是**此應用程序已要求運行時以不尋常的方式終止它。** 太糟糕了,它不在這裏發生,所以我可以調試:( – pwnu91 2011-02-03 10:51:09

回答

0

首先,你有一個緩衝區溢出Buffer

考慮這些行:

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

Buffer[dwRead] = 0; 

既然你傳遞sizeof(Buffer)dwNumberOfBytesToRead前行參數的dwRead最大值爲sizeof(Buffer)。如果發生這種情況,後一行將在Buffer的末尾寫入一個字節。您的數據佈局不會導致崩潰(但這純粹是偶然!),除非您已啓用運行時安全檢查,這可以解釋崩潰消息。

此外,據我記得,在Microsoft實現中,「此應用程序要求運行時以非常規方式終止它」的消息在assert()terminate()中顯示。 (我目前沒有MSVC可用,無法驗證它)。我在這段代碼中沒有看到任何一個的原因,所以如果它不是Buffer溢出,也可以在其他地方查找它。

0

嘗試刪除的strlen:

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

在這種情況下,功能會更安全一點。

無論如何,請考慮使用Crash Dump Analysis。在這種情況下,您將能夠從「某些計算機」獲取的故障轉儲中檢查調用堆棧。