Как узнать состояние StreamSocket?

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

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

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

Можете ли вы сделать что-нибудь с Socket::peerAddress()?

Paul Sanders 21.01.2019 00:04

Нет... он по-прежнему возвращал одноранговый адрес, даже если я разорвал соединение со стороны сервера.

SamuelCheung 21.01.2019 00:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
857
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

после нескольких часов гугления я выяснил это не проблема с 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 отключен.

SamuelCheung 22.01.2019 02:58

на данный момент я считаю внедрение дополнительного механизма сердцебиения лучшим решением, хотя он также добавляет дополнительную пропускную способность и вычислительные накладные расходы (я знаю, что это немного, но все имеет значение xD)

SamuelCheung 22.01.2019 03:01

У меня есть «серьезный» вопрос: если я использую StreamSocket::connectNB(), как мне определить, когда я могу использовать этот сокет для отправки или получения данных?

SamuelCheung 23.01.2019 09:11

Либо используйте poll() или select(), чтобы проверить, доступен ли сокет для записи или чтения, либо используйте (неблокирующий) sendBytes() или receiveBytes() и посмотрите код возврата (POCO_EAGAIN, если он неблокирующий и еще не готов) или исключение, которое он выдает.

Günter Obiltschnig 23.01.2019 13:29

я попробовал StreamSocket::getOption(), чтобы получить код ошибки, и он дал мне 0; и StreamSocket::sendBytes(), и StreamSocket::receiveBytes() немедленно вернули -1. я думаю, что я сделал что-то не так?

SamuelCheung 23.01.2019 15:35

Другие вопросы по теме