Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C lwip_即使在插座关闭后也会选择块_C_Sockets_Mqtt_Freertos_Lwip - Fatal编程技术网

C lwip_即使在插座关闭后也会选择块

C lwip_即使在插座关闭后也会选择块,c,sockets,mqtt,freertos,lwip,C,Sockets,Mqtt,Freertos,Lwip,在我当前的应用程序中,我有一个MQTT任务,每当套接字上有可用数据时,另一个助手任务就会唤醒这个MQTT任务。我目前正在使用lwip_select实现这一点。因此,每当发生事件时,我都会使用它来触发唤醒MQTT任务 我的助手任务看起来有点像这样: ... ... fd_set read_fds; fd_set write_fds; fd_set err_fds; FD_ZERO (&read_fds); FD_ZERO (&write_fds);

在我当前的应用程序中,我有一个MQTT任务,每当套接字上有可用数据时,另一个助手任务就会唤醒这个MQTT任务。我目前正在使用lwip_select实现这一点。因此,每当发生事件时,我都会使用它来触发唤醒MQTT任务

我的助手任务看起来有点像这样:

...
...
fd_set      read_fds;
fd_set      write_fds;
fd_set      err_fds;

FD_ZERO (&read_fds);
FD_ZERO (&write_fds);
FD_ZERO (&err_fds);

FD_SET  (s, &read_fds);
FD_SET  (s, &err_fds);

ctx->state = SST_RX_READY;
while( 1 )
{
    if (ctx->state == SST_RX_CLOSING)
    {
        ctx->state = SST_RX_CLOSED;
        vTaskDelete( NULL );
    }
    if( lwip_select( s + 1, &read_fds, &write_fds, &err_fds, NULL ) == -1 )
    {
        //if socket is closed lwip_select will return -1
        vTaskDelete( NULL );
        return;
    }

    if( FD_ISSET( s, &read_fds ) )
    {
        configASSERT( ctx->rx_callback );
        ctx->rx_callback( ( Socket_t )ctx );
        //vTaskDelay( 10 ); // delay a little bit to yield time for RX
    }
}
...
...
在while循环中,我一直调用lwip_select,并且timeout参数故意保持为NULL,因为我根本不希望此任务超时,当没有来自MQTT的数据时,可能会有很长一段时间。但是,如果我的主MQTT任务完成其工作并正常关闭套接字,则此助手任务仍处于活动状态,并且正在lwip_select上阻塞

一些额外信息: 操作系统:Freertos 10.0.1 硬件平台:Cortex m3 LWIP版本:2.4.0

解决这个问题的任何可能的线索都会很有帮助


谢谢

您能准确地解释一下“优雅地关闭插座”是什么意思吗?你不是说你把某个版本的
叫做close
吧?您是否遇到过这样的情况:通过调用
lwip\u select
,可以关闭仍在使用中的套接字?那肯定行不通。您可以关闭连接,但不能在使用时关闭套接字!通过“优雅地关闭套接字”,我的意思是MQTT任务将毫无错误地完成其工作,并调用lwip_close。当套接字仍在使用时不能关闭时,只有两个任务处于活动状态,即MQTT任务和helper任务。MQTT任务负责打开、使用和关闭套接字。助手任务(上面发布的代码片段)将只检查是否有任何要接收的数据包,如果是,它将唤醒MQTT任务。但是,当MQTT任务关闭套接字并退出时,助手任务仍在lwip_select上阻塞。您是否询问如何使其在
lwip_select
上阻塞的任务解除阻塞,因为您没有采取任何措施使其解除阻塞?或者你是在问为什么它不解锁,因为你做了一些事情让它解锁?如果是后者,您是如何使其解锁的?需要说明的是,
lwip\u select
中的任务不是在您要关闭的套接字上进行选择,对吗?因为如果是这样的话,您就在套接字仍在使用时关闭它。在套接字上选择就是使用该套接字。(一个任务如何在select中取消阻止另一个任务的一般答案是在管道上发送一个虚拟字节。)