21

我对 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();

另外,这家伙说要真正干净地关闭连接,必须先执行socket.Shutdown(SocketShudown.Send),然后等待对方响应。

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

4

2 回答 2

16

关闭套接字关闭连接,而 Close 是围绕 Dispose 的包装方法,所以一般

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

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

或者,考虑使用 (yeh):

using (var socket = new Socket(...))
{
    ....
    socket.Shutdown(SocketShutdown.Both);
    socket.Close();
}
于 2013-03-12T07:12:07.467 回答
1

根据 MSDN,对于面向连接的套接字,如果调用Connect,则应该调用Close. 这适用于BeginConnect并且ConnectAsync同样适用。

using (var socket = new Socket(...)) {
    socket.Connect(host);
    ...
    socket.Shutdown(SocketShutdown.Both);
    socket.Close();
}
于 2020-06-04T21:56:53.160 回答