设置InternetConnect的httpRequest连接数
来源:互联网 发布:鱼雷炸鱼淘宝有卖的吗 编辑:程序博客网 时间:2024/05/14 05:30
这几天在写http断点下传的实现,遇到问题:
* 开多个httpConnect, 每个Connect对应一个httpRequest, 如果超过4个httpConnect, sendHttpRequest时,阻塞住了.
只有前面的httpConnect任务完成后,被阻塞线程的sendHttpRequest才返回.
* 如果是下载不同服务器的文件, 则不会出现sendHttpRequest阻塞.
同事在stackoverflow上找到资料, 可以设置连接同一个服务器httpConnect的连接数为指定值,解决了这个问题。
整理一下。
HINTERNET FCHttpRequest::create_connect(){ std::wstring strTemp = L""; HINTERNET hConnect = NULL; INTERNET_PORT nPort = INTERNET_DEFAULT_HTTP_PORT; CLsStopWatchTick watch; if (m_tmp_scheme == INTERNET_SCHEME_HTTPS) { nPort = INTERNET_DEFAULT_HTTPS_PORT; } watch.start(); hConnect = InternetConnect(m_http_session.GetHandle(), m_tmp_host.c_str(), nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); strTemp = ns_base::StringFormatV( L"create_connect() : [FCHttpRequest = 0x%p][TID = %d] : hConnect = 0x%p\r\n", this, ::GetCurrentThreadId(), hConnect); watch.StopAndShow(strTemp.c_str(), TRUE); if (NULL != hConnect) { /// 试验过了, 在程序开始设置 HINTERNE 为NULL, 那种http连接数, 是没用的 /// 只有在InternetConnect 所在线程中, 对有效httpConnect设置指定连接数, 才有效 SetHttpMaxConnectNumberEx(hConnect); } return hConnect;}
void FCHttpRequest::SetHttpMaxConnectNumberEx(HINTERNET hHandle){ BOOL bRc = FALSE; DWORD dwErr = 0; DWORD dwHttpConnectMax = 50/*5 * 5 * 2 + 10*/; ///< (5条任务,一个任务5条线程) * 2 + 10(备用数目) DWORD dwRecvBufLen = 0; BOOL bRcOld = FALSE; DWORD dwHttpConnectOld = 0; ///< INTERNET_OPTION_MAX_CONNS_PER_SERVER's cnt BOOL bRcOld10 = FALSE; DWORD dwHttpConnectOld10 = 0; ///< INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER's cnt dwHttpConnectOld = 0; bRc = GetHttpMaxConnectNumberEx(hHandle, INTERNET_OPTION_MAX_CONNS_PER_SERVER, dwHttpConnectOld); dwErr = ::GetLastError(); _ASSERT(bRc); dwHttpConnectOld10 = 0; bRc = GetHttpMaxConnectNumberEx(hHandle, INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER, dwHttpConnectOld10); dwErr = ::GetLastError(); _ASSERT(bRc); /// 设置不成功, 设置成功的,取出来还是原来的值. bRc = InternetSetOption(hHandle,INTERNET_OPTION_MAX_CONNS_PER_SERVER,&dwHttpConnectMax,sizeof(DWORD)); dwErr = ::GetLastError();// _ASSERT(bRc); ///< 虽然为FALSE, 但是已经有效果了 bRc = InternetSetOption(hHandle,INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER,&dwHttpConnectMax,sizeof(DWORD)); dwErr = ::GetLastError();// _ASSERT(bRc); ///< 虽然为FALSE, 但是已经有效果了 /// 这里得到的连接数, 也是旧的, 但是从程序运行效果上看,已经生效了 dwHttpConnectOld = 0; bRc = GetHttpMaxConnectNumberEx(hHandle, INTERNET_OPTION_MAX_CONNS_PER_SERVER, dwHttpConnectOld); dwErr = ::GetLastError(); _ASSERT(bRc); /// 这里得到的连接数, 也是旧的, 但是从程序运行效果上看,已经生效了 dwHttpConnectOld10 = 0; bRc = GetHttpMaxConnectNumberEx(hHandle, INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER, dwHttpConnectOld10); dwErr = ::GetLastError(); _ASSERT(bRc);}
BOOL FCHttpRequest::GetHttpMaxConnectNumberEx(HINTERNET hHandle, DWORD dwOption, DWORD& dwCnt){ BOOL bRc = FALSE; DWORD dwRecvBufLen = 0; dwCnt = 0; bRc = InternetQueryOption( NULL, dwOption, NULL, &dwRecvBufLen); if (!bRc) { _ASSERT(dwRecvBufLen == sizeof(DWORD)); bRc = ::InternetQueryOption( NULL, dwOption, (LPVOID)&dwCnt, &dwRecvBufLen); _ASSERT(bRc); } return bRc;}
1 0
- 设置InternetConnect的httpRequest连接数
- InternetConnect的URL参数不要加“http://”
- PB FTP InternetConnect返回0的问题
- 关于建立远程连接HttpRequest 遇到的问题
- 合理设置apache的连接数
- Oracle并发连接数的设置
- Oracle并发连接数的设置
- 设置mysql最大连接数的方法
- 设置mysql最大连接数的方法
- 设置mysql最大连接数的方法
- 设置mysql最大连接数的方法
- Oracle并发连接数的设置
- 设置WinXp IIS的最大连接数
- 设置mysql最大连接数的方法
- 设置mysql最大连接数的方法
- tomcat最大连接数的设置
- Oracle并发连接数的设置方案
- 查看与设置mysql的连接数
- Scala第2章习题PART3
- 解决VirtualBox下CentOS分辨率全屏设置
- 学校宣传片
- 网易公开课讲义1 Linear Regression 笔记
- C++:【转】3种继承关系和3中访问权限
- 设置InternetConnect的httpRequest连接数
- 学习ios开发你必须掌握的mac 和Xcode快捷方式
- %I64d 和%lld 的区别
- HDU1161 Eddy's mistakes
- C语言中的经典小程序8——选择排序
- 在vs2010上配置cuda环境
- Android 资源文件中@、@android:type、@*、?、@+含义和区别
- C++动态分配内存new delete
- 全排列