Как прервать сокет в 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 ()
вы можете попробовать закодировать все вторичные сокеты в другом потоке и убить его, когда вы хотите разбить соединения.