Не удается повторно подключиться к TCP-партнеру после временного переключения WiFi - PullRequest
0 голосов
/ 10 января 2020

У меня есть следующие настройки:

  • Ноутбук + плата ESP32 в том же WiFi
  • TCP-слушатель на плате, подключенный TCP-клиент на ноутбуке
  • I Я выполняю сценарий python на ноутбуке, который отправляет некоторые параметры плате по TCP
  • при поступлении параметров, плата отвечает сообщением «Хорошо, brb» и закрывает сокет
  • плата делает вещи (если это важно: отключается от старого WiFi, чтобы подключиться к другому WiFi, где она подключается через TCP ко второй плате для выполнения некоторых измерений)
  • плата снова присоединяется к старому WiFi и пытается подключиться к ноутбуку через новый разъем для отправки данных измерений, поэтому на этот раз плата является клиентом, а ноутбук слушателем

Чтобы подготовить соединение на ноутбуке, оно закрывается старый сокет (sock.close()), когда приходит сообщение «Хорошо, brb» и ждет новых соединений (new_sock, addr = sock_server.accept()), чтобы затем получить материал (new_sock.recv()).

Однако, при попытке сделать это, я получаю errno 113 (нет маршрута к хосту). Я на 99% уверен, что сценарий python не проблема, он работал с другими досками раньше. Итак, вот важная часть эскиза ESP32:

// Connection to socket sock already happened and we just received data!

// Get the sender's IP address as string
if (source_addr.sin6_family == PF_INET) 
{
    inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr.s_addr, addr_str, sizeof(addr_str) - 1);
} 
else if (source_addr.sin6_family == PF_INET6) 
{
    inet6_ntoa_r(source_addr.sin6_addr, addr_str, sizeof(addr_str) - 1);
}

int err = send(sock, brb_message, sizeof(brb_message), 0);
if (err < 0) 
{
    ESP_LOGE(TAG, "Error occurred during sending: errno %d", errno);
    break;
}

shutdown(sock, 0);
closesocket(sock);

esp_wifi_disconnect();
connect_to_new_wifi_and_do_stuff();

// get back into joint WiFi
esp_wifi_disconnect();
connect_to_old_wifi();

// send back collected data via TCP
dest_addr.sin_addr.s_addr = inet_addr(addr_str);
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(TCP_PORT); 
addr_family = AF_INET;
ip_protocol = IPPROTO_IP;

int sock_back =  socket(addr_family, SOCK_STREAM, ip_protocol);
if (sock_back < 0) 
{
    ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
}
ESP_LOGI(TAG, "Socket created, connecting to %s:%d", addr_str, TCP_PORT);

else
{
    err = connect(sock_back, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
    while (err < 0) 
    {
        ESP_LOGE(TAG, "Socket unable to connect: errno %d", errno);
        err = connect(sock_back, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
    }
    ESP_LOGI(TAG, "Successfully connected");

    err = send(sock_back, run_id, sizeof(run_id), 0);
    if (err < 0) 
    {
        ESP_LOGE(TAG, "Error occurred during sending to %s: errno %d", addr_str, errno);
        break;
    }   
}

У меня такое ощущение, что я делаю что-то не так, но я действительно не могу это понять, и я пытался несколько дней. Есть идеи?

1 Ответ

0 голосов
/ 10 апреля 2020

Если кто-то когда-либо сталкивался с такой же проблемой - оказалось, что он подключен к брандмауэру Windows или тому подобному. Он работал безупречно, когда я попробовал его с Raspberry P ie вместо моего ноутбука.

...