web-dev-qa-db-ja.com

close()とclose socket()は交換可能ですか?

ここでは、close()を使用してソケットを破棄するという回答をたくさん見てきましたが、 msdn から使用したガイドでは、closesocket()を使用しています。違いがあるのか​​、どちらかを使う理由があるのか​​しら。

どちらの場合も、shutdown()を使用するという提案があり、それで問題はありません。

9
Enigma

close()は* nix関数です。これはどのファイル記述子でも機能し、* nixのソケットはファイル記述子の例であるため、ソケットも正しく閉じます。

closesocket()はWindows固有の関数であり、特にソケットで機能します。 Windowsのソケットは* nixスタイルのファイル記述子を使用しません。socket()は代わりにカーネルオブジェクトへのハンドルを返すため、closesocket()で閉じる必要があります。

BSDソケットに、どこでも使用できるsocket関数に対応する特定のものが含まれていないのはかなり恥ずべきことですが、それは人生です。

最後になりましたが、ソケットをshutdown 'することとソケットを閉じることを混同しないでください。 shutdown()はソケットでの送信を停止しますが、ソケットはシステムに残り、それに関連するすべてのリソースは残ります。ソケットをシャットダウンした後も、ソケットを閉じる必要があります。

14
SergeyA