ESP8266 проверка, отключен ли TCP-клиент...неформально

Привет, у меня есть библиотека ESP8266WiFi. Обычно я проверяю наличие соединения TCP-клиента с помощью client.connected().

Но, похоже, он все еще возвращает true, если мой TCP-клиент неожиданно отключается (например, отключается от WiFi/пропадает питание/...). Из-за чего моя программа застревает в бесконечном цикле.

Есть ли более надежный способ проверки состояния соединения?

, 👍0


1 ответ


Лучший ответ:

2

У вас есть неотъемлемая проблема, заключающаяся в том, что TCP-соединение завершается явным сообщением «FIN» от завершающей стороны, за которым следуют FIN-ACK и ACK.

Обратитесь к здесь.

Если ваш клиент (или сервер) просто выключается, не закрывая соединение должным образом, то все. Соединение зависает, и никакие данные не будут переданы, если это явно не обработано.

Если вам нужно знать, все еще ли клиент, вы должны использовать механизм heartbeat. То есть, после того, как прошел некоторый период времени без ответа, запросите сторону соединения с сообщением "heartbeat" и посмотрите, ответит ли она через заданное максимальное время. Обратный способ — заставить клиента отправлять периодическое сообщение "Keep Alive", которое удерживает соединение, пока оно отправляется повторно.

Обратитесь к здесь и здесь.

,

Благодаря вашему ответу я понял общую идею. Не могу найти способ проверить наличие сообщения KeepAlive в библиотеке ESP8266. Поэтому я вручную отправляю данные клиенту через x секунд простоя и закрываю соединение, если клиент не отвечает. В глубине души мне кажется, что должен быть встроенный способ сделать это, не так ли?, @MoonFan

@MoonFan Мне нелегко найти универсальный код, который бы работал во всех случаях. Вам придётся реализовать его самостоятельно, используя таймер для отслеживания временных меток (последнее полученное/отправленное сообщение и т.д.). Помимо millis, можно использовать более сложную [библиотеку таймеров](https://github.com/philbowles/h4)., @Maximilian Gerhardt