Сам стек TCP вряд ли своевременно сообщит вам, если соединение больше не жизнеспособно (если оно не локально разорвано и ОС не может сообщать о локальных сбоях в стек).Из-за тайм-аутов повторной передачи (см. здесь ) и того, что может потребоваться «довольно много времени», прежде чем запись выдаст ошибку, указывающую на разрыв соединения.Это, конечно, по замыслу, просто дизайн противоречит тому, что вы хотите сделать.
Вы можете попробовать использовать протокол TCP для поддержки активности, но ИМХО, это действительно не стоит усилий, и вы 'Было бы лучше реализовать некоторую форму ACK уровня приложения, если это возможно, чтобы вы могли заставить свой протокол уровня приложения отправлять ответ, как только он получит некоторые данные от вас.Если вы не можете сделать это, и ваш запрос вызывает ответ с другого конца соединения, тогда вы можете просто установить таймер, основываясь на том, как долго вы готовы ждать ответа, прежде чем предположить, что соединение разорвано.Когда таймер истекает, вы закрываете свое соединение и устанавливаете новое.
Может случиться так, что вы можете отключить попытку нового соединения, а также отправить запрос на старое соединение, если новое соединение станет доступно до того, как выполучить ответ от старого, затем вы можете отправить запрос на новое соединение и закрыть старое ... Конечно, это зависит от того, может ли ваше приложение справиться с подобными вещами.
Наконец,если соединение разрывается из-за неактивности, то, возможно, вы могли бы добавить пинг уровня приложения к вашему протоколу, который можно настроить так, чтобы он отправлял сообщения время от времени, чтобы: а) гарантировать, что соединение живо, и б) мешать маршрутизаторам или брандмауэрам думатьсоединение разорвано.