Проблема при работе через HTTPS
От: Alex Goriachev  
Дата: 28.04.03 15:58
Оценка:
Есть программа, совершающая на 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 пакета (видимо ответы на что-то). Таймауты на коннект, отсылку и приём установлены. Если просто запретить пакеты от сервера в момент нормальной работы, то срабатывает таймаут. После возникновения вышеописанной проблемы никакие операции (вплоть до отрубания инета) не могут вывести программу из такого состояния.

Может кто сталкивался? Подскажите как лечить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.