关闭和清理Socket连接的正确方法是什么?
问题描述:
我对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)
,然后等待对方回应。
什么是关闭,然后清理套接字连接的正确方法?
答
关闭插座关闭连接,并且关闭是围绕处置的包装方法中,所以一般
socket.Shutdown(SocketShutdown.Both);
socket.Close();
应该足够了。有人可能会争辩说,Close实现可能会改变一天(因此它不再称为Dispose),并且在调用Close之后应该手动调用Dispose,但我怀疑这会发生,但我个人认为:)
或者,考虑使用using yeh):
using (var socket = new Socket(...))
{
....
socket.Shutdown(SocketShutdown.Both);
}
那个人是对的。我认为这取决于两者之间的协议。如果您希望能够继续接收一段时间,那么是的,您应该告诉其他人您的关机意图,并说您将停止发送,但仍然可以接收。 – uriDium 2013-03-12 07:20:33
“那个人”大部分是正确的,因为我已经类似地模拟了我的服务器代码。但是我相信只有在异步(非阻塞)套接字中才需要半关闭然后等待的方法。我相信在非阻塞套接字的情况下,您称之为“发送”,然后立即关闭,如果存在需要重新传输的数据包,则会出现数据丢失的一些边缘条件。 – selbie 2013-03-12 08:40:29
我对套接字服务器使用了混合方法。服务器将首先关闭连接并等待recv()返回0或错误以指示客户端已完成。但是,我有一个定时器,每隔45秒周期性地关闭,以扫描和关闭自上次扫描后一直徘徊的任何半开连接。 – selbie 2013-03-12 08:42:23