C ++ WinInet InternetCloseHandle崩溃

时间:2015-09-01 18:05:41

标签: c++ wininet

我写了一个使用WinInet-library的程序。该计划每天运行约8-12小时。首先它连接到互联网,然后使用FTP来下载/上传文件。之后它启动一个循环,在不同的时间间隔内启动两个线程。两个线程都在执行GET - 对同一服务器的请求,看起来像这样:

private void Thread()
{
    if(!InternetGetConnectedState(NULL, NULL))
    {
        connectToInternet();
    }

    // some code...

    HINTERNET httpOpenRequest = HttpOpenRequest(
        hHTTPConnection,        // InternetConnect-Handle
        L"GET",                 // HTTP-Verb
        request_target,         // FileName
        L"HTTP/1.1",            // HTTP-Version
        NULL,                   // Referer
        NULL,                   // AcceptTypes
        INTERNET_FLAG_RELOAD,   // Flags
        0                       // Context
        );

    BOOL httpsRequest = HttpSendRequest(
            httpOpenRequest,    // Handle of HttpOpenRequest
            NULL,               // Headers
            0,                  // Headers-Length
            NULL,               // Optional
            0                   // Optional-Length
            );

    InternetCloseHandle(httpOpenRequest); // App-Crash sometimes here!
}

我的connectToInternet - 函数在这里:

int connectToInternet()
{
    DWORD InetTest1 = 16000;
    while (InetTest1 != 0)
    {
        InetTest1 = InternetAttemptConnect(0);
        // wait 1 second for next attempt
        if (InetTest1 != 0)
        {
            Sleep(1000);
        }
    }

    BOOL InetTest2 = FALSE;
    while (!InetTest2)
    {
        InetTest2 = InternetCheckConnection(
            L"http://www.example.com",  // URL
            FLAG_ICC_FORCE_CONNECTION,  // Flags
            0                           // Reserved
            );
        // wait 1 second for next attempt
        if (!InetTest2)
        {
            Sleep(1000);
        }
    }

    while (hInternetOpen == NULL)
    {
        hInternetOpen = InternetOpen(
            L"Custom-Agent",            // Agent
            INTERNET_OPEN_TYPE_DIRECT,  // AccessType
            NULL,                       // ProxyName
            NULL,                       // ProxyBypass
            0                           // Flags
            );

        // wait 1 second for next attempt
        if (hInternetOpen == NULL)
        {
            Sleep(1000);
        }
    }

    while (hHTTPConnection == NULL)
    {
        hHTTPConnection = InternetConnect(
            hInternetOpen,              // InternetOpen-Handle
            L"www.example.com",         // ServerName
            INTERNET_DEFAULT_HTTP_PORT, // ServerPort
            NULL,                       // Username
            NULL,                       // Password
            INTERNET_SERVICE_HTTP,      // Service
            0,                          // Flags
            0                           // Context
            );

        // wait 1 second for next attempt
        if (hHTTPConnection == NULL)
        {
            Sleep(1000);
        }
    }

    return 0;
}

(我在这里找到的这个功能的基本工作流程:https://msdn.microsoft.com/en-us/library/windows/desktop/aa383996(v=vs.85).aspx

现在问题:

Q1: 当两个线程中的一个调用InternetCloseHandle(httpOpenRequest)时,我似乎很少遇到应用崩溃。我无法找到这些应用程序崩溃的原因......你有什么想法吗?

Q2: 运行程序的笔记本电脑似乎存在互联网连接问题,因为它会经常连续几分钟或几小时失去连接。因此,如果connectToInternet()InternetGetConnectedState(NULL, NULL),我会先在两个主题中调用false。是否需要执行此步骤,或者如果我不调用connect-function,它是否也可以工作?如果连接中断,全局HINTERNET - 句柄是否无效?

[编辑] 同时我怀疑我的程序导致连接问题,因为我的有线网络上也没有互联网访问权限在家!我做错了吗?

0 个答案:

没有答案