Есть программа, совершающая на WEB сервере некоторые операции через HTTPS соединение.
В главной процедуре создаётся поток, функция которого выглядит примерно так:
DWORD WINAPI WorkThread(LPVOID Id)
{
int iId=int(Id);
char *lpszId;
lpszId = new char[10];
sprintf(lpszId,"%i",iId);
CMyClass bs(lpszId,lpszBsEmail,lpszBsHost,lpszBsRoot);
for (;;)
{
if (WaitForSingleObject(eBsEndEvents[iId], 1000) != WAIT_TIMEOUT)
{
break;
}
bs.DoSomething();
Sleep(3000);
}
bs.~CMyClass();
return 0;
}
Метод DoSomething класса CMyClass выглядит примерно так:
bool CMyClass::DoSomething()
{
DWORD dwFlags;
dwFlags = INTERNET_FLAG_SECURE;
dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA|
SECURITY_FLAG_IGNORE_REVOCATION |
SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTP |
SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTPS |
SECURITY_FLAG_IGNORE_CERT_DATE_INVALID |
SECURITY_FLAG_IGNORE_CERT_CN_INVALID;
LPCTSTR AcceptTypes[] = { TEXT("*/*"), NULL};
bool isOk=true;
HINTERNET hInternet =InternetOpen(
TEXT("WinInet Test"),
INTERNET_OPEN_TYPE_DIRECT,
NULL,NULL,
0);
if (hInternet != NULL)
{
HINTERNET hConnect = InternetConnect(
hInternet,
TEXT("myhost.com"),
INTERNET_DEFAULT_HTTPS_PORT,
NULL,NULL,
INTERNET_SERVICE_HTTP,
0,
1u);
if (hConnect != NULL)
{
HINTERNET hRequest = HttpOpenRequest(
hConnect,
TEXT("POST"),
TEXT("/cgi-bin/main.exe?1"),
NULL,
NULL,
AcceptTypes,
dwFlags,
1);
if (hRequest != NULL)
{
BOOL bSend = HttpSendRequest(hRequest,
NULL,
0,
post,
postlen);
CString sData=TEXT("");
}
HINTERNET hRequest = HttpOpenRequest(
hConnect,
TEXT("POST"),
TEXT("/cgi-bin/main.exe?2"),
NULL,
NULL,
AcceptTypes,
dwFlags,
1);
if (hRequest != NULL)
{
BOOL bSend = HttpSendRequest(hRequest,
NULL,
0,
post,
postlen);
}
}
}
}
В общем конструкция HttpOpenRequest/HttpSendRequest/CloseHandle(hRequest) используется 5 раз. Каждый раз на WEB сервер отсылаются как GET, так и POST запросы.
Эта конструкция крутится в цикле потока с перерывами на 3 сек.
ПРОБЛЕМА:
Код нормально работает
минут 20. При этом происходит авторизация на сервере, отправка данных, получение ответа. Пишутся логи. Данные с сервера приходят нормально. Но через некоторое время происходит следующее: в момент исполнения HttpSendRequest (не важно который по счету) прекращается приём данных с сервера на неопределённое время. При этом каждую минуту (ровно!!! смотрел сниффером) с сервера приходят 1-2 пакета (видимо ответы на что-то). Таймауты на коннект, отсылку и приём установлены. Если просто запретить пакеты от сервера в момент нормальной работы, то срабатывает таймаут. После возникновения вышеописанной проблемы никакие операции (вплоть до отрубания инета) не могут вывести программу из такого состояния.
Может кто сталкивался? Подскажите как лечить?