2013-03-12 18 views
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)を実行する必要があります。

正しい接続方法は何ですか。次に、ソケット接続をクリーンアップしますか?

+0

その男は右半分です。私はそれが2人の間のプロトコルに依存すると思う。それでも時間がかかる場合は、相手側にシャットダウンの意思を伝え、送信を停止しますが、まだ受信できると言う必要があります。 – uriDium

+0

「その男」は、私のサーバーコードを同様にモデル化しているので、ほとんど正しいです。しかし、私はhalf-close-then-waitのアプローチは、非同期(非ブロッキング)ソケットにのみ必要であると考えています。私はノンブロッキングソケットの場合、あなたはすぐにCloseに続いて "Send"を呼ぶと信じています。再送が必要なパケットがあれば、データが失われるいくつかのエッジ条件があります。 – selbie

+0

私は私のソケットサーバとのハイブリッドアプローチを使用しました。サーバーは最初に接続を半分クローズし、recv()が0を返すのを待つか、クライアントが完了したことを示すエラーを返します。しかし、私はタイマーを定期的に45秒ごとに掃引し、最後の掃引以来、周りに残っている半開きの接続を閉じます。 – selbie

答えて

11

閉会ソケットは接続を閉じ、そして閉じるので、一般的に

socket.Shutdown(SocketShutdown.Both); 
socket.Close(); 

十分なはずです、処分のラッパー・メソッドです。 Close実装がある日に変更される可能性があるので、閉じる呼び出し後にDisposeを手動で呼び出す必要があります。

また、( yeh):

using (var socket = new Socket(...)) 
{ 
    .... 
    socket.Shutdown(SocketShutdown.Both); 
}