InternetConnect超时的问题

wininet 里面的InternetConnect是不能设置超时参数的,一旦遇到特殊情况,就会一直阻塞在这里,有时候阻塞几个小时,所以这里一定要自己处理一下。



int Request::ThreadInternetConnect(PVOID param){

    InternetConnectParam *p_connect_param = (InternetConnectParam*)param;
    p_connect_param->hSession = NULL;
    // 打开http session     
    p_connect_param->hSession = InternetConnect(p_connect_param->hInternet, p_connect_param->host.c_str(),
        (INTERNET_PORT)p_connect_param->port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);

    return 1;
}

BOOL Request::Http(){
     // ......此处省略前面的代码.......
    hInternet = InternetOpen(user_agent.c_str(),
        INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    if (NULL == hInternet)
    {
        wsprintfA(szTempText, "InternetOpen error. ErrCode=[%u]", GetLastError());
        response.error_msg = szTempText;
        InternetCloseHandle(hInternet);
        return FALSE;
    }

    // 打开http session    

    /*
    HINTERNET hSession = InternetConnect(hInternet, host.c_str(),
        (INTERNET_PORT)nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
    */
    
    //InternetConnect连接某些情况会超时,使用线程来InternetConnect,超时则直接结束线程
    InternetConnectParam param;
    param.hInternet = hInternet;
    param.host = host;
    param.port = nPort;

    HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadInternetConnect, (LPVOID)&param, 0, NULL);
    //超时10秒,如果等待结果是超时
    if (WaitForSingleObject(hThread, 10 * 1000) == WAIT_TIMEOUT){
        response.error_msg += "InternetConnect error. ErrCode=[connect timeout]";

        TerminateThread(hThread, 0);
        CloseHandle(hThread);
        param.hSession = NULL;
    }

    HINTERNET hSession = param.hSession;
    
    if (!hSession){
        wsprintfA(szTempText, "InternetConnect error. ErrCode=[%u]", GetLastError());
        response.error_msg += szTempText;
    
        InternetCloseHandle(hSession);
        InternetCloseHandle(hInternet);
        return FALSE;
    }

 // ......此处省略后面的代码.......

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,314评论 19 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,623评论 11 349
  • 2016年国庆假期终于把此书过完,整理笔记和体会于此。 关于书名 书名源于俄罗斯的演员斯坦尼斯拉夫斯基创作的《演员...
    李剑飞的简书阅读 7,419评论 2 65
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,966评论 24 1,002
  • 幸福,其实蛮简单的,就是你吃了困,困了睡,觉得无聊,想干点活,扫扫地,那我陪你。 很有幸地碰到了这样一...
    柳清和阅读 262评论 0 1

友情链接更多精彩内容