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

StringBuilder sb = new StringBuilder();
sb.append("abcdef");
sb.deleteCharAt(sb.length() - 1);
assertEquals("abcde",sb.toString());
// true
6
задан 30 June 2009 в 20:03
поделиться

5 ответов

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

Чтобы выполнить нормальное постепенное отключение:

вы делаете:

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

Однако, чтобы выполнить Abort, вы делаете:

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

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

2
ответ дан 17 December 2019 в 18:19
поделиться

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

1
ответ дан 17 December 2019 в 18:19
поделиться

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

0
ответ дан 17 December 2019 в 18:19
поделиться

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

-1
ответ дан 17 December 2019 в 18:19
поделиться

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

-1
ответ дан 17 December 2019 в 18:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: