Проверить, подключен ли сокет, гораздо сложнее, чем кажется на первый взгляд.Например, сокет все еще может быть подключен с точки зрения вашей системы, но другой хост, возможно, сломался.Или может быть проблема в сети и т. Д.
Как правило, если вы просто хотите узнать, не вызывали ли вы еще (close) в сокете, вы можете сделать:
bool connected = socket.impl()->initialized();
С другой стороны, если вам действительно нужно выяснить, живо ли еще соединение, вам нужно будет отправить сообщение партнеру и дождаться его ответа.Это единственный надежный способ сказать, что соединение живо.Если вам просто нужно выяснить, закрыл ли одноранговый узел сокет, попробуйте poll()
с коротким тайм-аутом, а затем receiveBytes()
(если poll()
указал, что есть что прочитать), который вернет 0, еслиПир закрыл соединение.Вы также можете попробовать установить сокет в неблокирующее состояние и вызвать receiveBytes()
.
. Я также рекомендую ознакомиться с Unix Socket FAQ .
При написании сетевого кода,будь то сокеты TCP или HTTP, или любой другой протокол, я настоятельно рекомендовал иметь четкие знания о конкретных протоколах и механизмах, а не просто использовать API высокого уровня и надеяться на лучшее.