【发布时间】: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 也没有中途改变。