3

wininet\InternetOpenUrlAを呼び出し、次に wininet\InternetReadFile を呼び出し、完了したら、True を返すwininet\InternetCloseHandleを呼び出します。これは、ハンドルが正常に閉じられたが、接続がまだ確立された状態であることを意味します。

wininet\InternetCloseHandle を呼び出しても接続が閉じないのはなぜですか?

4

2 に答える 2

4

WinInet は、同じサーバーへの将来の要求のために接続をキャッシュして再利用できます。

于 2013-07-31T19:22:18.087 に答える
4

WinInet は可能な限りソケットを再利用しようとします。そのため、ハンドルを解放してもソケットをアクティブに保ち、InternetOpen への次の呼び出しに備えることができます。ほとんどの場合、これは良いことであり、心配する必要はありません。

本当にすぐに閉じる必要がある場合は、最終的な InternetCloseHandle の後に InternetSetOption を呼び出すことで、WinInet をだましてこれを実行させることができます。

...
InternetCloseHandle(hInternet);
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);

これを行うと、グローバルな WinInet 設定が変更されたことが WinInet に通知され (レジストリなどで)、すべてのソケットを閉じてリセットするしかありません。ただし、これは明らかに意図した使用法ではなく、WinInet で多数の接続を確立している場合、パフォーマンスに影響を与える可能性があります。

于 2014-08-12T11:22:20.670 に答える