Проблема с wininet C ++ - PullRequest
       8

Проблема с wininet C ++

0 голосов
/ 03 февраля 2011

Может кто-нибудь найти проблему в этой функции? Мое приложение выполняет несколько запросов, и если первый запрос использует SSL, приложение падает на некоторых компьютерах (на моих 4 компьютерах + VMware работает нормально без сбоев).

Вот код

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

Спасибо.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2011

Попробуйте удалить strlen:

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

В этом случае функция будет немного более безопасной.

В любом случае рассмотрите возможность использования Анализ аварийных дампов .В этом случае вы сможете проверить стек вызовов из аварийного дампа, полученного с «некоторых компьютеров».

0 голосов
/ 03 февраля 2011

Прежде всего, у вас переполнение буфера с Buffer.

. Рассмотрим следующие строки:

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

и

Buffer[dwRead] = 0;

Поскольку вы передаете sizeof(Buffer) как параметр dwNumberOfBytesToRead в предыдущей строке, максимальное значение dwRead равно sizeof(Buffer).Если такой случай имеет место, последняя строка записывает один байт после конца Buffer.Ваше расположение данных делает маловероятным сбой (но это чистый шанс!), Если только вы не включили Проверки безопасности во время выполнения, которые могут объяснить сообщение об ошибке.

Кроме того, насколько я помню, "Это приложение запросило Runtime прекратить его необычным способом »сообщение отображается либо assert() или terminate() в реализации Microsoft.(У меня нет MSVC на данный момент и я не могу это проверить).Я не вижу ни одной причины в этом фрагменте кода, поэтому, если это не переполнение Buffer, ищите его и в других местах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...