Мне нужно отправить один запрос на сервер более быстро и многократно.
Поэтому я реализовал такой код.
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 работает некорректно после возникновения ошибки.
Я стараюсь отправить один запрос на сервер быстрее и правильнее, без потерь.
Пожалуйста, научите меня неправильной проблеме.
Или, если у вас есть другой лучший способ, пожалуйста, скажите мне.
Благодарю.
Код ошибки 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 удаляет любое созданное исключение из кучи (и ничего не делает).