Как прервать сокет в C#

Я пытаюсь прервать соединение сокета, чтобы клиент на другом конце получил " программное обеспечение WSAECONNABORTED (10053), вызванное прерыванием соединения."сообщение об ошибке при опросе соединения.

Close () и Shutdown () будут отключены изящно. Я не хочу изящного разъединения. Я хочу сделать аборт, чтобы клиент почувствовал, что что-то действительно пошло не так.

спасибо,

EDIT: я кодирую сервер, и я хочу прервать сокеты для подключения клиенты

6 ответов


мне удалось смоделировать эту ситуацию:

сделать нормальное грациозное разъединение:

вы:

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

однако, чтобы сделать аборт, вы делаете:

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

Я думаю, что разница в том, что клиент не получит никаких пакетов ACK и думает, что компьютер перезагрузится или что-то еще.


основные детали, в том числе, когда на самом деле целесообразно принудительно прервать соединение, описаны здесь очень подробно (https://stackoverflow.com/a/13088864/1280848).

способ C# сделать это:

socket.LingerState = new LingerOption(true, 0);
socket.Close();

то есть, использовать SO_LINGER С TIME_WAIT = 0


Что делать, если вы убьете процесс, и / или перезагрузите машину, и/или отключите кабель ethernet, не вызывая Close() и / или Shutdown()?


Я не думаю, что можно получить поведение, которое вы хотите с реализацией .Net Socket, кроме того, что клиент отправляет прерывистые keep-alives. Я пробовал всевозможные вещи, чтобы получить поведение, которое вы описали, и в конечном итоге реализовал сообщения keep-alive. Если sever вызывает Close (), клиентский сокет получит ошибку прерывания соединения при следующей попытке отправки данных.


попробуйте вызвать EndSend() или EndReceive () в зависимости от ситуации, за которой немедленно следует Dispose ()


вы можете попробовать закодировать все вторичные сокеты в другом потоке и убить его, когда вы хотите разбить соединения.