15

Winsock を使用してソケット経由でデータを送信した後、次のように接続を閉じる必要があります。

closesocket(ConnectSocket);
WSACleanup();

ソケット経由でデータを送信する API を作成しています。後でソケットを閉じる必要がある場合は、API に関数を追加して、ユーザーがデータの取得を完了したときに通知できるようにする必要があります。便宜上、ソケットを閉じないと問題になりますか?

4

1 に答える 1

22

いずれにせよ、ソケットを閉じないと、プログラムはファイル記述子をリークします。通常、プログラムは限られた数のファイル記述子しか開くことができないため、これが頻繁に発生すると、問題が発生する可能性があります。

ソケットがアドレスにバインドされている場合、ソケットが閉じられるまで、他のソケットは同じアドレスにバインドできません。よく知られているポート (たとえば、25 や 80 など) にバインドされている場合、他のポートがそのポートにバインドされなくなります...これはおそらく直面する可能性のある最も深刻な問題です。一時的なポートにバインドされている場合、これはそれほど重要ではありませんが、それでもポートの数には限りがあり、これが頻繁に発生すると不足する可能性があります。UDP ソケットはバインドされることなく自由に使用できるため、この問題は UDP ソケットには当てはまらないことに注意してください。

ソケットがリッスン ソケットである (listen()が呼び出されている) 場合、システムは、このソケットを閉じない限り、このソケットで接続を受け入れ続けます (ただし、 で指定されたバックログ制限までlisten())。

shutdown()ソケットが TCP ソケットであり、接続されている場合、ソケットが閉じられるか呼び出されない限り、TCP 接続は閉じられません。したがって、この場合、少なくともshutdown()ソケットを閉じることができない場合は必ず呼び出す必要があります。

結論として、ソケットを閉じないと、多かれ少なかれ重要ないくつかの問題が発生する可能性があります。一般に、UDP よりも TCP で多くの問題が発生することが予想されます。ソケットの使用が終わったら、可能であれば必ずソケットを閉じる必要があります。

于 2013-06-12T23:50:21.017 に答える