【问题标题】:Sending http request repeatedly, more fast (async mode)重复发送http请求,更快(异步模式)
【发布时间】:2013-12-05 09:52:59
【问题描述】:

我需要更快更重复地向服务器发送一个请求。

所以我实现了这样的代码。

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”日志。

在记录一到两个请求数据后,服务器不再记录到数据库中

发生错误后,HttpSendRequest API 似乎无法正常工作。

我的目标是更快、更正确地向服务器发送一个请求,而不会丢失。

请教我什么是错的问题。

或者如果你有其他最好的方法,请告诉我。

谢谢。

【问题讨论】:

    标签: c++ visual-studio http asynchronous


    【解决方案1】:

    错误代码 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() (除非你重新抛出)。 CException::Delete 方法将删除在堆上创建的任何抛出的异常(否则不执行任何操作)。

    【讨论】:

    • 错误代码1是“无效函数”,而不是“无效参数”
    • 在记录一两次请求数据后,服务器不再记录到数据库中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多