wininet\InternetOpenUrlAを呼び出し、次に wininet\InternetReadFile を呼び出し、完了したら、True を返すwininet\InternetCloseHandleを呼び出します。これは、ハンドルが正常に閉じられたが、接続がまだ確立された状態であることを意味します。
wininet\InternetCloseHandle を呼び出しても接続が閉じないのはなぜですか?
wininet\InternetOpenUrlAを呼び出し、次に wininet\InternetReadFile を呼び出し、完了したら、True を返すwininet\InternetCloseHandleを呼び出します。これは、ハンドルが正常に閉じられたが、接続がまだ確立された状態であることを意味します。
wininet\InternetCloseHandle を呼び出しても接続が閉じないのはなぜですか?
WinInet は、同じサーバーへの将来の要求のために接続をキャッシュして再利用できます。
WinInet は可能な限りソケットを再利用しようとします。そのため、ハンドルを解放してもソケットをアクティブに保ち、InternetOpen への次の呼び出しに備えることができます。ほとんどの場合、これは良いことであり、心配する必要はありません。
本当にすぐに閉じる必要がある場合は、最終的な InternetCloseHandle の後に InternetSetOption を呼び出すことで、WinInet をだましてこれを実行させることができます。
...
InternetCloseHandle(hInternet);
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
これを行うと、グローバルな WinInet 設定が変更されたことが WinInet に通知され (レジストリなどで)、すべてのソケットを閉じてリセットするしかありません。ただし、これは明らかに意図した使用法ではなく、WinInet で多数の接続を確立している場合、パフォーマンスに影響を与える可能性があります。