Подтвердить что ты не робот

Каков надлежащий способ закрытия и очистки соединения 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();

Кроме того, этот парень говорит, что для действительно чистого соединения необходимо выполнить socket.Shutdown(SocketShudown.Send), а затем ждать, пока другая сторона ответить.

Каков правильный способ закрыть, а затем очистить соединение сокета?

4b9b3361

Ответ 1

Закрывающее гнездо закрывает соединение, а Close - это метод-обертка вокруг Dispose, поэтому обычно

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

должно быть достаточно. Некоторые могут утверждать, что реализация Close может измениться в один прекрасный день (так что она больше не вызывает Dispose), и вы вызываете Dispose вручную после вызова Close, но я сомневаюсь, что это произойдет лично:)

В качестве альтернативы рассмотрите возможность использования (yeh):

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