После некоторого тестирования кажется, что документация для Socket.Connected неверна или, по крайней мере, вводит в заблуждение. clientSocket.Connected
станет ложным только после вызова clientSocket.close()
. Я думаю, что это возврат к оригинальному API сокетов C Berkeley и его терминологии. Сокет связывается, когда с ним связан локальный адрес, а сокет подключается, когда с ним связан удаленный адрес. Несмотря на то, что удаленная сторона закрыла соединение, локальный сокет все еще имеет связь, и поэтому он все еще «подключен».
Однако вот метод, который работает :
!(socket.Poll(0, SelectMode.SelectRead) && socket.Available == 0)
Он основан на том факте, что закрытое соединение будет помечено как читаемое, даже если данные недоступны.
Если вы хотите обнаружить такие условия, как обрыв сетевых кабелей или внезапное отключение компьютеров, ситуация несколько сложнее. В этих условиях ваш компьютер никогда не получает пакет, указывающий, что сокет закрыт. Он должен обнаружить, что удаленная сторона исчезла, отправив пакеты и заметив, что ответ не возвращается. Вы можете сделать это на уровне приложения как часть вашего протокола или использовать опцию TCP KeepAlive. Использование TCP Keep Alive из .NET не так просто; вам, вероятно, лучше встроить механизм поддержки активности в протокол (альтернативно, вы можете задать отдельный вопрос для «Как включить TCP Keep Alive в .NET и установить интервал поддержания активности?»).