7

当调用LwIP netconn_accept()netconn_recv()函数时,如果我们使用的是 RTOS,它将阻塞线程并等待连接,直到超时或永远,取决于LWIP_SO_RCVTIME0. 超时持续时间等于SYS_ARCH_TIMEOUT.

在核心包含部分LwIP堆栈SYS_ARCH_TIMEOUT中定义为0xffffffff,所以我认为它不会被更改。

实际上,我希望它检查是否建立了连接,如果没有,则继续线程。但是,如果我打电话netconn_accept(),它只会阻塞线程并永远等待(或很长时间)......我不想改变定义值,SYS_ARCH_TIMEOUT因为我在不同情况下需要不同的超时......

这样做的好方法是什么?谢谢。

4

4 回答 4

8

轮询 TCP 连接(或接受)通常是一种不好的做法。考虑生成一个专门用于阻塞 netconn_accept() 调用的新线程。

我理解使用 RTOS 的局限性,但是只产生一个堆栈空间最小的辅助线程应该不是一个大问题。

我相信实施经典生产者-消费者问题的解决方案并不难。

如果您谈论的是 FreeRTOS,它拥有所有需要的工具——信号量和线程。

于 2012-06-01T10:52:45.250 回答
5

根本不要使用阻塞 API。lwIP 堆栈提供了一个本地的、非阻塞的、事件驱动的 API,它比阻塞更高效,并且不需要阻塞 RTOS。YouTube 视频展示(位于http://youtu.be/MBk5wJ_8jEc)展示了如何在基于 QP 状态机框架的实时系统中使用此 API。

于 2012-06-04T01:57:21.693 回答
3

创建一个新线程尝试建立该连接。只要它没有连接,就让线程休眠一段时间,以便 RTOS 可以进行上下文切换!(切换到另一个任务)

于 2012-06-01T11:25:13.403 回答
2

您可以使用该netconn_set_recvtimeout函数将侦听套接字上的超时设置为较小的值,例如 1 毫秒。

例如。(为了简单起见,错误处理离开了新、绑定、监听)

struct netconn *conn = netconn_new(NETCONN_TCP);
if (conn)
{
    if (netconn_bind(conn, IP_ADDR_ANY, 1025/*PORT_NUMBER*/) != ERR_OK)
    {
        return;
    }
    if (netconn_listen(conn) != ERR_OK)
    {
        return;
    }
    netconn_set_recvtimeout(conn, 1);
}

然后调用accept最多会延迟1ms:

struct netconn *newConn;
err_t result = netconn_accept(conn, &newConn);
if (result == ERR_OK)
{
    // Handle the connected netconn here
}
else if (result == ERR_TIMEOUT)
{
    // No pending connections
}
else
{
    // A problem with the listen socket accepting the connection
}
于 2015-09-04T13:55:23.833 回答