StringBuilder sb = new StringBuilder();
sb.append("abcdef");
sb.deleteCharAt(sb.length() - 1);
assertEquals("abcde",sb.toString());
// true
Мне удалось смоделировать эту ситуацию:
Чтобы выполнить нормальное постепенное отключение:
вы делаете:
socket.Shutdown(SocketShutdown.Both);
socket.Close();
Однако, чтобы выполнить Abort, вы делаете:
socket.Shutdown(SocketShutdown.Send);
socket.Close();
Я думаю, разница в том, что клиент не будет получать никаких пакетов ACK и думает, что компьютер перезагружен или что-то в этом роде.
Что если вы завершите процесс и / или перезагрузите компьютер, и / или отключите кабель Ethernet, не вызывая Close () и / или Shutdown ()?
Я не думаю, что можно добиться желаемого поведения с реализацией .Net Socket, кроме как когда клиент отправляет прерывистые сообщения keep-alive. Я пробовал все, что угодно, чтобы получить описанное вами поведение, и в итоге реализовал сообщения keep-alive. Если сервер вызывает Close (), клиентский сокет получит сообщение об ошибке прерывания соединения при следующей попытке отправить данные.
попробуйте вызвать EndSend () или EndReceive () в зависимости от ситуации, сразу за которым следует Dispose ()
вы можете попробовать закодировать все вторичные сокеты в другом потоке и уничтожить его, когда вы хотите разорвать соединения.