Повторная отправка http-запроса, более быстрая (асинхронный режим)

0

Мне нужно отправить один запрос на сервер более быстро и многократно.

Поэтому я реализовал такой код.

BOOL CTestDlg::OnInitDialog()
{
    ...

    m_hInstance = InternetOpen(L"asynchttp", INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,INTERNET_FLAG_ASYNC);
    if(m_hInstance == NULL)
    {
        ErrorLog(L"InternetOpen Failed");
        return TRUE;
    }

    if (InternetSetStatusCallback(m_hInstance,(INTERNET_STATUS_CALLBACK)&Callback) == INTERNET_INVALID_STATUS_CALLBACK)
    {
        ErrorLog(L"Set Callback Function Failed");
        return TRUE;
    }

    m_hConnect = InternetConnect(m_hInstance, L"192.168.2.116", 8080,NULL,NULL,INTERNET_SERVICE_HTTP,INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_KEEP_CONNECTION,1);
    if(m_hConnect == NULL)
    {
        if(DWORD dwError = GetLastError() != ERROR_IO_PENDING)
        {
            ErrorLog(L"Fail to Connect Server");
            return TRUE;
        }
        WaitForSingleObject(hConnectedEvent, INFINITE);
    }

    CreateThread(0 , 0 , (LPTHREAD_START_ROUTINE)SendThread , 0 , 0 , 0);

    return TRUE;
}


void __stdcall Callback(HINTERNET hInternet,DWORD dwContext,DWORD dwInternetStatus,LPVOID lpStatusInfo,DWORD dwStatusInfoLen)
{
    switch(dwContext)
    {
    case 1:
          {
              SetEvent(hConnectedEvent);
          }
          break;
    }
}


DWORD SendThread(LPVOID lpParam)
{
    TCHAR *szAceptType[] = {_T("*/*") , NULL};
    CString szContentType = _T("Content-Type: application/x-www-form-urlencoded\r\n");

    char szPostData[MAX_PATH];
    sprintf(szPostData , "num=1234&str=3240");

    HINTERNET hRequest = HttpOpenRequest(m_hConnect, L"POST", L"/TestWeb/index.jsp", HTTP_VERSION , NULL , (LPCTSTR*)szAceptType , 0, 2);

    while(1)
    {
        try
        {
            if (!HttpSendRequest(hRequest, szContentType, (DWORD)szContentType.GetLength(), szPostData,(DWORD)strlen(szPostData)))
            {
                if (DWORD dwError = GetLastError() != ERROR_IO_PENDING)
                    ErrorLog(L"SendRequest: Error = %d" , dwError);
            }
        }
        catch (CException* e)
        {
            UNREFERENCED_PARAMETER(e);
        }
        Sleep(100);
    }
    return 0;
}

Когда вы выполняете или отлаживаете программу, я часто видел этот журнал "SendRequest; Error = 1".

И сервер больше не записывается в базу данных после записи одного или двух данных запроса

Похоже, что API HttpSendRequest работает некорректно после возникновения ошибки.

Я стараюсь отправить один запрос на сервер быстрее и правильнее, без потерь.

Пожалуйста, научите меня неправильной проблеме.

Или, если у вас есть другой лучший способ, пожалуйста, скажите мне.

Благодарю.

Теги:
visual-studio
asynchronous
http

1 ответ

0

Код ошибки 1 - "Недопустимый параметр".

Кажется, вы смешиваете строки ASCII (char и sprintf) и Unicode в приведенном выше примере. Вы пробовали со всеми строками Unicode (что делает szPostData массивом WCHAR)? Из MSDN: "Там две версии HttpSendRequest -HttpSendRequestA (используется с сборками ANSI) и HttpSendRequestW (используется с Unicode-сборками)". Далее говорится о возврате ERROR_INVALID_PARAMETER. http://msdn.microsoft.com/en-us/library/windows/desktop/aa384247(v=vs.85).aspx

Кроме того, я не использовал MFC в течение длительного времени, но я помню, что вы должны вызывать e-> Delete() в вашем обработчике исключений (если вы не выбрали r e-). Метод CException :: Delete удаляет любое созданное исключение из кучи (и ничего не делает).

  • 0
    Код ошибки 1 - «Неверная функция», а не «Неверный параметр»
  • 0
    И сервер больше не записывает в базу данных, после записи одного или двух данных запроса

Ещё вопросы

Сообщество Overcoder
Наверх
Меню