mbed 套接字连接需要很长时间

mbed socket connection takes a long time

我正在与我的 Mbed 控制器战斗并且它赢了:/ 下面是我的部分代码:

eth.connect();
pc.printf("ethernet OK");
sock.set_blocking(false,200);
pc.printf(" socket setting OK ");
sock.connect("192.168.1.100", 80);
pc.printf("GO! GO! GO!");
conn = sock.is_connected();

当服务器打开时,我可以用套接字连接,没有问题。但是当我关闭我的服务器时,我的程序在 sock.connect(...) 行中等待了很长时间,然后它继续前进。我想让它继续前进,但我不想等这么久:/

我发现我应该将套接字设置从阻塞更改为非阻塞,并将超时从默认值=1500 更改为更少。我尽可能地更改了它:
- 我的 socket.h 图书馆的一部分:
void set_blocking(bool blocking, unsigned int timeout=200);
- 我的 socket.cpp 图书馆的一部分:
Socket::Socket() : _sock_fd(-1), _blocking(false), _timeout(200)
仍然没有。它等待大约 17-18 秒,但我想将其更改为最大。 1-2秒。

如果你给我任何提示,我会很高兴:)

假设您正在使用 mbed OS,将套接字设置为阻塞并将超时设置为您认为合适的任何值。无需修改。方法语法可见here.

但是,我无法重现您的问题。您可以使用调试器并确认应用程序是否挂在这一行 - https://github.com/ARMmbed/mbed-os/blob/533e6f0febb5ea582a61f0c8aaf686c70333524f/features/netsocket/TCPSocket.cpp#L57

棉花糖的建议应该没问题

理论上您也可以尝试将 TCP_SYNMAXRTX 宏设置为更低的值。不过,它可能会产生其他一些无法预料的后果(我不确定,因为我对 LwIP 了解不多)。

首先我要说的是,TCP_SYNMAXRTX 改变是有帮助的,它对我有帮助,但根本没有。在我的例子中,重要的是将 mbed OS 更改为最新版本。以前有带有套接字设置的库,但实际上它们可以正常工作,因为 mbed OS 包含 EthernetInterface 和其他库(您不应该将其作为外部库导入)。

感谢您的宝贵时间和善意! :)