17
ソケット接続を閉じてクリーンアップしようとしているSocketオブジェクトの関連メソッドの豊富さによって、ちょっと混乱します。次のことを考えてみます。またソケット接続を閉じてクリーンアップする適切な方法は何ですか?
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect("192.168.1.22", 8333);
socket.Send(Encoding.UTF8.GetBytes("hello"));
// now for the closing fun
socket.Shutdown(SocketShutdown.Both);
socket.Disconnect(false);
socket.Close();
socket.Dispose();
、this guyが本当にきれいに接続を閉じることを言って、1は対応する反対側のを待ち、その後、socket.Shutdown(SocketShudown.Send)
を実行する必要があります。
正しい接続方法は何ですか。次に、ソケット接続をクリーンアップしますか?
その男は右半分です。私はそれが2人の間のプロトコルに依存すると思う。それでも時間がかかる場合は、相手側にシャットダウンの意思を伝え、送信を停止しますが、まだ受信できると言う必要があります。 – uriDium
「その男」は、私のサーバーコードを同様にモデル化しているので、ほとんど正しいです。しかし、私はhalf-close-then-waitのアプローチは、非同期(非ブロッキング)ソケットにのみ必要であると考えています。私はノンブロッキングソケットの場合、あなたはすぐにCloseに続いて "Send"を呼ぶと信じています。再送が必要なパケットがあれば、データが失われるいくつかのエッジ条件があります。 – selbie
私は私のソケットサーバとのハイブリッドアプローチを使用しました。サーバーは最初に接続を半分クローズし、recv()が0を返すのを待つか、クライアントが完了したことを示すエラーを返します。しかし、私はタイマーを定期的に45秒ごとに掃引し、最後の掃引以来、周りに残っている半開きの接続を閉じます。 – selbie