我打電話wininet\InternetOpenUrlA,然後wininet \ InternetReadFile,當我完成時,我打電話wininet\InternetCloseHandle,它返回True。這意味着句柄成功關閉,但連接仍處於已建立狀態。WinAPI:InternetCloseHandle函數關閉句柄,但不是連接
爲什麼不緊密連接時,我打電話WININET \ InternetCloseHandle?
我打電話wininet\InternetOpenUrlA,然後wininet \ InternetReadFile,當我完成時,我打電話wininet\InternetCloseHandle,它返回True。這意味着句柄成功關閉,但連接仍處於已建立狀態。WinAPI:InternetCloseHandle函數關閉句柄,但不是連接
爲什麼不緊密連接時,我打電話WININET \ InternetCloseHandle?
WinInet可以爲將來的請求緩存和重用連接到相同的服務器。
WinInet的嘗試,當你釋放它可以選擇保留插座活躍,準備到InternetOpen下次調用句柄重新使用插座的地方就可以了,所以連。大多數時候這是一件好事,你不需要擔心。
如果你真的需要它立即關閉,你可以通過你的最後InternetCloseHandle後調用InternetSetOption愚弄的WinInet成這樣:
...
InternetCloseHandle(hInternet);
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
這樣做可以告訴WinInet的全球WinInet的設置已更改(例如,在註冊表中),所以它別無選擇,只能關閉所有套接字並重置自身。但是,這顯然不是預期的用法,並且如果您與WinInet進行大量連接,將會產生一些性能影響。
好吧,我需要連接的下一個請求之前關閉,因爲創建一個新的路由表條目,並請求應通過不同的接口,但因爲連接不關閉請求經過老接口和忽略路由表條目。 – Chris
作爲臨時解決方法,每個請求都在一個進程中進行管理,並且何時完成,我終止強制連接關閉的進程。 – Chris
致電時'InternetOpenUrl中,()',忽略'INTERNET_FLAG_EXISTING_CONNECT'標誌,以便它不使用一個緩存的連接,並忽略'INTERNET_FLAG_KEEP_CONNECTION'標誌,以便它不緩存的連接。另一個選擇是使用'HttpAddRequestHeaders()'手動爲請求添加一個「Connection:close」頭,這樣它就會強制服務器在每次響應後關閉連接。 –