【问题标题】:mbed socket connection takes a long timembed 套接字连接需要很长时间
【发布时间】:2017-07-26 13:22:53
【问题描述】:

我正在与我的 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(...) 行中等待了很长时间,然后它继续前进。我希望它继续前进,但我不想等待这么长时间:/

我发现我应该将套接字设置从阻塞更改为非阻塞,并将超时从 default=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 秒。

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

【问题讨论】:

    标签: c++ sockets timeout mbed


    【解决方案1】:

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

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

    【讨论】:

    • 你好 Sarah :) 我使用不同的库 - 我刚刚导入了 EthernetInteface,在那里我找到了 Socket 和其他文件,但版权来自 2012 年,源代码看起来不同。是我应该下载的任何其他库吗?也许这是某种“不聪明”的问题,但我是 mbed 编程的新手 :) 你问的是 TCPSocket.cpp,但在 EthernetInterface 中该文件甚至不存在,所以我想它应该是什么别的。你能告诉我我应该寻找什么吗?我上传了最新鲜的EthernetInterface,但还是一样。
    • 编辑后:我使用Socket from:developer.mbed.org/handbook/Socket,其实很类比。我尝试将其设置为 blocking=true、timeout=200 和许多其他组合,但仍然没有:/
    • 切换到 mbed OS 5。EthernetInterface 包含在其中。您提到的 EthernetInterface 库不再受支持。首先克隆github.com/ARMmbed/mbed-os-example-blinky,然后添加相同的代码。这样您就应该拥有最新最好的版本,而且它可能会起作用。
    • 此处显示的示例 - docs.mbed.com/docs/mbed-os-api-reference/en/latest/APIs/… 将是一个更好的起点。克隆它并环顾四周。您会注意到在 mbed OS 之外没有多余的库。
    【解决方案2】:

    marshmallow 的建议应该没问题。

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

    【讨论】:

    • 你好 Jan ;) 正如你所说,我已经改变了这个 makro - 我喜欢风险,我将它设置为“1”。我看到,当我将卡靠近 RFID 阅读器时,它会非常快地推送数据(它会停止 3 秒,而不是 18 秒 - 这对我来说没问题),但是当我把下一张卡放在它的行为与之前相同 - 等待 18 秒.所以重启后,第一个数据正常,但下一个数据像以前一样阻塞。有什么BUFF需要清除吗?
    【解决方案3】:

    首先我要说,改变 TCP_SYNMAXRTX 是一件很重要的事情,它真的能帮到我,它帮了我,但根本没有。就我而言,重要的是将 mbed OS 更改为最新版本。以前有带有套接字设置的库,但实际上它们可以正常工作,因为 mbed OS 包含 EthernetInterface 和其他库(您不应该将其作为外部库导入)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多