Как мы узнаем состояние StreamSocket? - PullRequest
0 голосов
/ 21 января 2019

Как проверить, подключен или нет SteamSocket?

Я не нашел ничего связанного или полезного в официальных документах и ​​слайдах.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Проверить, подключен ли сокет, гораздо сложнее, чем кажется на первый взгляд.Например, сокет все еще может быть подключен с точки зрения вашей системы, но другой хост, возможно, сломался.Или может быть проблема в сети и т. Д.

Как правило, если вы просто хотите узнать, не вызывали ли вы еще (close) в сокете, вы можете сделать:

bool connected = socket.impl()->initialized();

С другой стороны, если вам действительно нужно выяснить, живо ли еще соединение, вам нужно будет отправить сообщение партнеру и дождаться его ответа.Это единственный надежный способ сказать, что соединение живо.Если вам просто нужно выяснить, закрыл ли одноранговый узел сокет, попробуйте poll() с коротким тайм-аутом, а затем receiveBytes() (если poll() указал, что есть что прочитать), который вернет 0, еслиПир закрыл соединение.Вы также можете попробовать установить сокет в неблокирующее состояние и вызвать receiveBytes().

. Я также рекомендую ознакомиться с Unix Socket FAQ .

При написании сетевого кода,будь то сокеты TCP или HTTP, или любой другой протокол, я настоятельно рекомендовал иметь четкие знания о конкретных протоколах и механизмах, а не просто использовать API высокого уровня и надеяться на лучшее.

0 голосов
/ 21 января 2019

после нескольких часов поиска в Google я понял это не проблема с Poco . похоже, что сами сокеты C не знают о своих собственных состояниях, а сокеты Poco основаны на сокетах C, поэтому все просто имеет смысл.

(я не изучил основы C / C ++, я непосредственно занимался программированием на Qt, сокеты которого предоставляют функции для проверки состояний соединения. из-за отсутствия базовых знаний C / C ++ мой вывод, приведенный выше, может быть неправильным )

для блокировки сокетов : на данный момент единственное решение, которое я нашел, это использовать StreamSocket :: receiveBytes (), он возвращает 0, если узел использовал shutdown () для закрытия соединения, и выдает исключения, если соединение потеряно или что-то в этом роде.

для неблокирующих розеток: совершенно не знаю:)

...