2012-01-15 13 views
10

TCPソケットを「正常に」閉じるにはどうすればよいでしょうか?TCPソケットを正しく閉じる

ホストバッファ内の残りのデータをすべてread()すると、リモートホストに問題が発生する可能性があることがわかりました(受信バッファ内のすべてのデータを失う可能性がありますが彼のアプリケーションによってまだ読まれていない)。あれは正しいですか?

そのような状況を回避するには、どのような方法が良いでしょうか?残っているバッファされたデータを無視してソケットを閉じることで、データが失われるのを気にしないことをAPIに伝える方法はありますか?

または、アプリケーションプロトコルレベルでこの問題を検討し、何らかの種類の暗黙的または明示的な「送信終了」信号を使用して、読み取りのためにソケットを閉じるのが安全であることを相手に伝える必要がありますか?

+0

どのような言語ですか? – Kiril

+0

バークレーソケット;私はCを使用していますが、私は一般的な概念に興味があります。 – lxgr

答えて

15

1)shutdownを呼び出して、これ以上ソケットにデータを書き込まないことを示します。

2)エラーが発生するか、接続が閉じられるまで、ソケットからreadに進みます。

3)今すぐcloseソケット。

これを行わないと、読み取るデータがまだある間に接続を終了することがあります。これは、妥当な終わりをもたらすでしょう。

+0

さて、私はそれをします。好奇心から:リモートホストに送信したデータが、受信バッファ内のデータを無視することによって失われる可能性はありますか? – lxgr

+1

はい、リモートホストに*送信したデータは、相手側がデータを読み取る前に中断が発生する可能性があるため、失われる可能性があります。接続がシャットダウンされていると確信するまで、 'close'を呼びたくはありません。 –

+3

1)シャットダウン(sock、1)、2)while(read(sock、...)= 0)3)close(sock) – ernesto

関連する問題