我对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 :(得分:13)
Closing socket关闭连接,Close是Dispose周围的包装器方法,所以通常是
socket.Shutdown(SocketShutdown.Both);
socket.Close();
应该足够了。有些人可能会争辩说,Close实现可能会改变一天(所以它不再调用Dispose),你应该在调用Close之后手动调用Dispose,但是我怀疑这会发生,亲自:)
或者,考虑使用(yeh):
using (var socket = new Socket(...))
{
....
socket.Shutdown(SocketShutdown.Both);
}
答案 1 :(得分:1)
根据MSDN,对于面向连接的套接字,如果调用Connect
,则应调用Close
。这同样适用于BeginConnect
和ConnectAsync
。
using (var socket = new Socket(...)) {
socket.Connect(host);
...
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}