Несмотря на то, что протокол TCP/IP является «ориентированным на соединение», обычно никакие данные не отправляются через незанятое соединение. Вы можете открыть сокет в течение года без одного бита, переданного по нему IP-стеком. Чтобы заметить, что соединение потеряно, вам необходимо отправить некоторые данные на уровне приложения. (*) Вы можете попробовать это, отключив телефонный кабель от вашего ADSL-модема. Все подключения на вашем ПК должны оставаться на месте, если в приложениях не существует какого-либо механизма keepalive на уровне приложений.
Таким образом, единственный способ заметить потерянное соединение - открыть TCP-соединение с некоторым сервером и прочитать некоторые данные из него. Возможно, самым простым способом может быть подключение к некоторому FTP-серверу и выборка небольшого файла - или списка каталогов - время от времени. Я никогда не видел общий сервер, который действительно предназначался для использования в этом случае, и владельцам FTP-сервера могут не нравиться клиенты, делающие это.
(*) Существует также механизм, называемый TCP KeepAlive, но во многих ОС вы должны активировать его для всех приложений, и это на самом деле не практично использовать, если вы хотите, чтобы заметить потерю связи быстро
Неправильно. Если вы установили тайм-аут чтения, и он запускает, вы получаете исключение, то есть операция завершается с ошибкой, но это не обязательно означает потерянное соединение. – EJP
@EJP Это не всегда правильно, но это даст вам хорошее представление о том, что происходит. – jjnguy
Нет, не будет. Вы не можете различать медленный сервер и потерянное соединение с таймаутом чтения. – EJP