【问题标题】:Can't reconnect to TCP partner after temporary WiFi switch临时 WiFi 切换后无法重新连接到 TCP 伙伴
【发布时间】:2020-01-10 13:51:07
【问题描述】:

我有以下设置:

  • 笔记本+ESP32板在同一个WiFi
  • 板上的 TCP 侦听器,笔记本电脑上连接的 TCP 客户端
  • 我正在笔记本电脑上执行一个 python 脚本,它通过 TCP 向开发板发送一些参数
  • 当参数到达时,板子会回复“Okay, brb”消息并关闭套接字
  • 板子做了一些事情(如果重要的话:从旧 WiFi 断开连接以连接到另一个 WiFi,然后它通过 TCP 连接到第二块板以进行一些测量)
  • 电路板再次加入旧 WiFi 并尝试通过新套接字连接回笔记本电脑以发送回测量数据,因此这次电路板是客户端,笔记本电脑是侦听器

为了准备笔记本电脑上的连接,它会在“Okay, brb”消息到达时关闭旧套接字 (sock.close()) 并等待新连接 (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;
    }   
}

我感觉我做错了什么,但我真的无法解决问题,我已经尝试了好几天。有什么想法吗?

【问题讨论】:

  • "(no route to host)" 这听起来好像没有完全完成设置“旧”wifi的接口。系统的路由表似乎没有正确/完全/根本没有调整。
  • 我已经尝试在重新连接到旧 WiFi 和实际启动 TCP 连接之间设置延迟(我认为是 5 秒?),但没有任何改变。也许我应该尝试更大的延迟......或者我必须手动调整路由表吗?
  • IP地址错误
  • 哎呀。可能是这样吧……我才发现IP字符串最后可能包含端口,那当然是IP地址不对。
  • 不,很遗憾没有变化。它连接到与以前相同的 IP,而且我的笔记本电脑的 IP 也没有中途改变。

标签: c sockets tcp wifi esp32


【解决方案1】:

如果有人遇到过同样的问题 - 原来是连接到 Windows 防火墙等。当我从 Raspberry Pie 而不是我的笔记本电脑尝试它时,它完美地执行了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2017-10-16
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多