C lwip_即使在插座关闭后也会选择块
在我当前的应用程序中,我有一个MQTT任务,每当套接字上有可用数据时,另一个助手任务就会唤醒这个MQTT任务。我目前正在使用lwip_select实现这一点。因此,每当发生事件时,我都会使用它来触发唤醒MQTT任务 我的助手任务看起来有点像这样: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);
...
...
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中取消阻止另一个任务的一般答案是在管道上发送一个虚拟字节。)