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

本文关键字:方法 是什么 连接 套接字 | 更新日期: 2023-09-27 18:03:40

我对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),然后等待另一方的响应。

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

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

关闭套接字将关闭连接,Close是Dispose的包装方法,所以通常

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

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

或者,考虑使用using (yeh):

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

根据MSDN,对于面向连接的套接字,如果调用Connect,则应该调用Close。这也适用于BeginConnectConnectAsync

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