Вы можете только сказать, отключен ли TCP-сокет, пытаясь отправить данные. Это связано с тем, что структура протокола такова, что он допускает временные перебои между узлами. Таким образом, если вы подключаетесь из A через R1 через R2 через R3 к B и некоторое время отправляете данные, а затем прекращаете отправку, вы можете отключить R2-> R3 (например), и ни A, ни B не заметят (или не позаботятся). Если вы затем подключите R2-> R4 и R4-> R3, а затем попытаетесь передать данные между A и B, то все будет «просто работать», и вы никогда не узнаете. Однако, если вы попытались отправить данные, когда R2-> R3 был отключен, вы (в конце концов, после всех попыток уровня TCP) вернули ошибку.
Теперь некоторые операционные системы могут предупреждать вас о том, что ваш локальный сетевой адаптер в данный момент не подключен, и вы можете использовать это, чтобы сказать: «Я больше не подключен к своим партнерам», но я бы не стал посоветуйте это.
Если важно, чтобы ваши одноранговые узлы знали, когда соединения «разорваны», то либо используйте сообщение ping уровня приложения для периодической отправки данных между одноранговыми узлами, либо используйте поддержку активности TCP. Лично я бы пошел на пинг сообщения ...
Редактировать: Конечно, все, что предполагает, что вы хотите знать, можете ли вы по-прежнему отправлять данные по соединению, в конце концов, вам СКАЗАНО, когда клиент больше не отправляет, потому что ваши чтения будут верните 0 байт, и вы ЗНАЕТЕ, когда он отсоединяет свою отправляющую сторону, потому что ваши записи не будут выполнены; Вы также ЗНАЕТЕ, когда выключаете сторону отправки или получения своего собственного конца соединения ...
Полагаю, я должен был придерживаться первоначальной реакции кишечной реакции "определить отключен";)