设置InternetConnect的httpRequest连接数
這幾天在寫(xiě)http斷點(diǎn)下傳的實(shí)現(xiàn),遇到問(wèn)題:
* 開(kāi)多個(gè)httpConnect, 每個(gè)Connect對(duì)應(yīng)一個(gè)httpRequest, 如果超過(guò)4個(gè)httpConnect, sendHttpRequest時(shí),阻塞住了.
?? 只有前面的httpConnect任務(wù)完成后,被阻塞線程的sendHttpRequest才返回.
* 如果是下載不同服務(wù)器的文件, 則不會(huì)出現(xiàn)sendHttpRequest阻塞.
同事在stackoverflow上找到資料, 可以設(shè)置連接同一個(gè)服務(wù)器httpConnect的連接數(shù)為指定值,解決了這個(gè)問(wèn)題。
2、WININET 的 超時(shí)據(jù)說(shuō)是bug,那么同步應(yīng)用只是try catch了,一般超時(shí)會(huì)在2-3分鐘返回;
3、長(zhǎng)連接,據(jù)說(shuō)是wininet被限制在同時(shí)保持2個(gè)會(huì)話連接,多了就阻塞。可以嘗試以下設(shè)置
inetSession.SetOption(INTERNET_OPTION_MAX_CONNS_PER_SERVER,&uParam,sizeof(int));
INTERNET_OPTION_CONNECT_TIMEOUT發(fā)送數(shù)據(jù)時(shí)間
INTERNET_OPTION_SEND_TIMEOUT、接受數(shù)據(jù)的時(shí)間
INTERNET_OPTION_RECEIVE_TIMEOUT、
INTERNET_OPTION_MAX_CONNS_PER_SERVER? 服務(wù)器連接個(gè)數(shù)
INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER 服務(wù)器連接個(gè)數(shù)
整理一下。
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){/// 試驗(yàn)過(guò)了, 在程序開(kāi)始設(shè)置 HINTERNE 為NULL, 那種http連接數(shù), 是沒(méi)用的/// 只有在InternetConnect 所在線程中, 對(duì)有效httpConnect設(shè)置指定連接數(shù), 才有效SetHttpMaxConnectNumberEx(hConnect);}return hConnect; } void FCHttpRequest::SetHttpMaxConnectNumberEx(HINTERNET hHandle) {BOOL bRc = FALSE;DWORD dwErr = 0;DWORD dwHttpConnectMax = 50/*5 * 5 * 2 + 10*/; ///< (5條任務(wù),一個(gè)任務(wù)5條線程) * 2 + 10(備用數(shù)目)DWORD dwRecvBufLen = 0;BOOL bRcOld = FALSE;DWORD dwHttpConnectOld = 0; ///< INTERNET_OPTION_MAX_CONNS_PER_SERVER's cntBOOL bRcOld10 = FALSE;DWORD dwHttpConnectOld10 = 0; ///< INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER's cntdwHttpConnectOld = 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);/// 設(shè)置不成功, 設(shè)置成功的,取出來(lái)還是原來(lái)的值.bRc = InternetSetOption(hHandle,INTERNET_OPTION_MAX_CONNS_PER_SERVER,&dwHttpConnectMax,sizeof(DWORD));dwErr = ::GetLastError(); // _ASSERT(bRc); ///< 雖然為FALSE, 但是已經(jīng)有效果了bRc = InternetSetOption(hHandle,INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER,&dwHttpConnectMax,sizeof(DWORD));dwErr = ::GetLastError(); // _ASSERT(bRc); ///< 雖然為FALSE, 但是已經(jīng)有效果了/// 這里得到的連接數(shù), 也是舊的, 但是從程序運(yùn)行效果上看,已經(jīng)生效了dwHttpConnectOld = 0;bRc = GetHttpMaxConnectNumberEx(hHandle, INTERNET_OPTION_MAX_CONNS_PER_SERVER, dwHttpConnectOld);dwErr = ::GetLastError();_ASSERT(bRc);/// 這里得到的連接數(shù), 也是舊的, 但是從程序運(yùn)行效果上看,已經(jīng)生效了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; }總結(jié)
以上是生活随笔為你收集整理的设置InternetConnect的httpRequest连接数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LInux 的流量限制
- 下一篇: GeForce Experience 安