2013-03-12 262 views
17

我对Socket对象上的相关方法的聚宝盆颇感困惑,它应该关闭并清理套接字连接。考虑以下几点:关闭和清理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说,要真正干净关闭连接,一个必须执行socket.Shutdown(SocketShudown.Send),然后等待对方回应。

什么是关闭,然后清理套接字连接的正确方法?

+0

那个人是对的。我认为这取决于两者之间的协议。如果您希望能够继续接收一段时间,那么是的,您应该告诉其他人您的关机意图,并说您将停止发送,但仍然可以接收。 – uriDium 2013-03-12 07:20:33

+0

“那个人”大部分是正确的,因为我已经类似地模拟了我的服务器代码。但是我相信只有在异步(非阻塞)套接字中才需要半关闭然后等待的方法。我相信在非阻塞套接字的情况下,您称之为“发送”,然后立即关闭,如果存在需要重新传输的数据包,则会出现数据丢失的一些边缘条件。 – selbie 2013-03-12 08:40:29

+0

我对套接字服务器使用了混合方法。服务器将首先关闭连接并等待recv()返回0或错误以指示客户端已完成。但是,我有一个定时器,每隔45秒周期性地关闭,以扫描和关闭自上次扫描后一直徘徊的任何半开连接。 – selbie 2013-03-12 08:42:23

回答

11

关闭插座关闭连接,并且关闭是围绕处置的包装方法中,所以一般

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

应该足够了。有人可能会争辩说,Close实现可能会改变一天(因此它不再称为Dispose),并且在调用Close之后应该手动调用Dispose,但我怀疑这会发生,但我个人认为:)

或者,考虑使用using yeh):

using (var socket = new Socket(...)) 
{ 
    .... 
    socket.Shutdown(SocketShutdown.Both); 
} 
相关问题