Как проверить, подключен ли SteamSocket или нет?
Я не нашел ничего связанного или полезного в официальных документах и слайдах.
заранее спасибо
Нет... он по-прежнему возвращал одноранговый адрес, даже если я разорвал соединение со стороны сервера.





после нескольких часов гугления я выяснил это не проблема с Poco. кажется, что сокеты C сами по себе не знают о своих собственных состояниях, а сокеты Poco основаны на сокетах C, поэтому все просто имеет смысл.
(я не изучил основы C/C++, я начал программировать непосредственно с Qt, чьи сокеты предоставляют функции для проверки состояний соединения. из-за отсутствия базовых знаний C/C++ мой вывод выше может быть неверным)
для блокировки сокетов: на данный момент единственное решение, которое я нашел, это использовать StreamSocket::receiveBytes(), он возвращает 0, если одноранговый узел использовал shutdown() для закрытия соединения, и генерирует исключения, если соединение потеряно или что-то подобное.
для неблокирующих сокетов: совершенно не знаю :)
Проверить, подключен ли еще сокет, намного сложнее, чем кажется на первый взгляд. Например, сокет может быть все еще подключен с точки зрения вашей системы, но другой хост мог выйти из строя. Или может быть проблема в сети и т.д.
Как правило, если вы просто хотите знать, не вызывали ли вы еще close() в сокете, вы можете сделать:
bool connected = socket.impl()->initialized();
С другой стороны, если вам действительно нужно узнать, живо ли соединение, вам придется отправить сообщение узлу и дождаться его ответа. Это единственный надежный способ сказать, что соединение активно. Если вам просто нужно узнать, закрыл ли пир сокет, попробуйте poll() с коротким тайм-аутом, а затем receiveBytes() (если poll() указал, что есть что читать), который вернет 0, если пир закрыл соединение. Вы также можете попробовать настроить сокет на неблокирующий и вызвать receiveBytes().
Я также рекомендую взглянуть на файл Часто задаваемые вопросы о сокетах Unix.
При написании сетевого кода, будь то сокеты TCP или HTTP, или любой другой протокол, я настоятельно рекомендовал иметь твердое знание конкретных протоколов и механизмов, а не просто использовать высокоуровневый API и надеяться на лучшее.
держать poll() -ing на неблокирующих сокетах звучит как хорошая идея, но это все еще не может справиться с ситуацией, например, когда кабель Ethernet отключен.
на данный момент я считаю внедрение дополнительного механизма сердцебиения лучшим решением, хотя он также добавляет дополнительную пропускную способность и вычислительные накладные расходы (я знаю, что это немного, но все имеет значение xD)
У меня есть «серьезный» вопрос: если я использую StreamSocket::connectNB(), как мне определить, когда я могу использовать этот сокет для отправки или получения данных?
Либо используйте poll() или select(), чтобы проверить, доступен ли сокет для записи или чтения, либо используйте (неблокирующий) sendBytes() или receiveBytes() и посмотрите код возврата (POCO_EAGAIN, если он неблокирующий и еще не готов) или исключение, которое он выдает.
я попробовал StreamSocket::getOption(), чтобы получить код ошибки, и он дал мне 0; и StreamSocket::sendBytes(), и StreamSocket::receiveBytes() немедленно вернули -1. я думаю, что я сделал что-то не так?
Можете ли вы сделать что-нибудь с
Socket::peerAddress()?