Это не Encoding.ASCII.GetString(data, 0, bytes).Trim();
, который блокирует навсегда, это stream.Read()
Если вы читаете, вы не можете легко отличить сервер (или любой другой шлюз NAT), разрывающий ваше соединение, и тот случай, когда сервер простоне имеет ничего, чтобы отправить вас.По крайней мере, в случае, когда пакеты TCP FIN / RST не доходят до вашего клиента в случае сбоя, или если шлюз NAT молча прерывает ваше соединение.
Что вы можете сделать;
- Установите Send / ReceiveTimeout и отправьте эхо-запрос на сервер, если истечет время ожидания, или внедрите собственные сообщения пульса через TCP-соединение.Восстановите или выполните другие действия, если вы не получили пульс в течение разумного времени.
- Установите параметр TCP keepalive и положитесь на него, чтобы сообщить, что сервер пропал.Смотрите код здесь .
Последний пункт скажет вам, если соединение tcp не удалось, он не скажет вам, если сервер несколько отказал - например, если вы CTRL + Z ваш сервер Perl, он просто будет сидеть тамничего не делать, когда окно tcp закрывается, поэтому вам может потребоваться реализовать собственные сообщения теплового удара, чтобы покрыть и такой случай, если вам нужно.