WiFiClient::connected() не работает

Я использую ESP32, чтобы открыть точку доступа и прослушивать соединения TCP через объект WiFiServer.

Когда я подключаю клиента к серверу, я хочу знать, когда он отключился.

В настоящее время у меня есть простой код как на стороне клиента, так и на стороне сервера. Я подключаюсь с помощью TcpClient в C#.

Когда я вызываю client.close() на стороне клиента, цикл client.connected() на сервере просто продолжается вечно.

Вот код ESP:

void setup()
{
   WiFi.mode(WIFI_AP);

   WiFi.softAP("test");

   WiFi.softAPConfig(IPAddress(192, 168, 4, 1), IPAddress(192, 168, 4, 1), IPAddress(255, 255, 255, 0));

   Serial.println(WiFi.localIP());

   server.begin();
}

void loop()
{
    while (!client)
    {
        client = server.available();

        delay(10);
    }

    while (client.connected())
    {
        Serial.println("ok");

        delay(1000);

        client.read();
    }
}

Код C#:

static void Main(string[] args)
{
     TcpClient client = new TcpClient("192.168.4.1", 222);

     client.Close();
}

, 👍1

Обсуждение

Добро пожаловать в Ардуино SE. Я не вижу здесь вопроса. Я вижу описание проблемы, но никаких попыток ее решения или вопроса о том, почему такая попытка исправления не сработала. Я рекомендую вам пройти экскурсию по адресу https://arduino.stackexchange.com/Tour, чтобы получить максимальную отдачу от этого сайта. Возможно, вы сможете конкретизировать его достаточно, чтобы предотвратить закрытие этого. Или, если он будет закрыт, возможно, вы можете опубликовать его с элементами, необходимыми для представления вопроса, который может привлечь полезные ответы., @SDsolar

@SDsolar Я абсолютно знаю, как писать на этом сайте, потому что я тоже на stackoverflow. Кроме того, мой вопрос понятен, когда вы читаете заголовок и вторую строку. Я объясняю здесь свое намерение, и, немного подумав, вы можете догадаться, что мне нужна помощь с этой функцией. Вместо того, чтобы писать бессмысленные комментарии, потратьте время на написание ответов., @schacker22

Я просто не вижу здесь вопроса, вот и все. Это сайт вопросов и ответов. Без одного у вас не может быть другого. Я проголосовал за то, чтобы оставить этот вопрос открытым, когда он появился в обзоре, думая, что вам нужно немного подтолкнуть., @SDsolar


2 ответа


1

Это ошибка в предыдущей версии библиотеки, о которой упоминалось в https://github.com/bportaluri/WiFiEsp/issues/14

Вы также можете использовать WiFi.softAPgetStationNum(), чтобы получить количество станций, подключенных к интерфейсу точки доступа.

,

WiFiEsp — это не та библиотека, которую я использую, не так ли? К сожалению, WiFi.softAPgetStationNum() мне не помогает, потому что мне нужно знать, когда отключился сокет, а не станция., @schacker22

Используете ли вы библиотеку WiFiEsp — это не вопрос, на который я знаю ответ., @Akhil Baranwal

Я видел функцию client.connected() только в WiFiEsp., @Akhil Baranwal

Это WiFiEspClient::connected(), а не WiFiClient::connected(), @schacker22


1

Мой фактический ответ

Вы можете попытаться запросить client.status() в качестве обходного пути. Когда никто не подключен, он должен вернуть 0.

Контекст

На чем вы основываетесь? Я попытался воспроизвести вашу проблему, но все работает, как и ожидалось, последовательный порт перестает печатать "ok", когда я отключаюсь.

Кроме того, какие именно библиотеки вы используете? Я включил ESP8266WiFi.h и WiFiClient.h.

Я использовал platformio v3.4 на модуле ESP8266-01 и простое приложение Android netcat в качестве клиента.

,

ESP8266WiFi.h предназначен для ESP8266, который является неправильной платформой, у меня есть плата для разработки ESP32. Я включил #include <WiFi.h>., @schacker22