重复发送http请求,速度更快(异步模式)
Sending http request repeatedly, more fast (async mode)
我需要更快、更重复地向服务器发送一个请求。
所以我实现了这样的代码。
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-urlencodedrn");
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似乎无法正常工作。
我的目标是更快、更正确地向服务器发送一个请求,而不会丢失。
请教我什么是错题。
或者,如果你有其他最好的方法,请告诉我。
谢谢。
错误代码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方法将删除在堆上创建的任何抛出的异常(不执行其他操作)。
相关文章:
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 为什么在保护模式下继承升级不起作用
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 此模式的C++RegEx
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- 如果 Proactor 设计模式优于异步 I/O,为什么它在 ASIO 中不是默认值?
- QMenu 无模式/异步
- InternetOpenUrl处于异步模式
- 异步模式下使用的WinHttp-ERROR_INTERNET_CANNOT_CONNECT如何干净地关闭连接
- 重复发送http请求,速度更快(异步模式)
- 在 winsock 服务器中使用异步套接字的非阻塞模式C++不同
- 在异步模式下使用ReadFile测试readbytes是否等于toread字节
- 嵌入式系统状态模式:存储与异步事件相关的信息
- 我可以在 boost::asio 异步模式下创建和接受套接字时使用 boost::shared_ptr 吗?
- CPPCMS会话异步.模式
- 在异步模式下使用FtpFindFirstFile unicode版本访问违反
- 在异步模式下使用会话的CPPCMS示例