closesocket 与 select 返回值的问题
使用sal+dfs中的select
应用线程主动closesocket 时,select返回0,但select设置超时后也返回0,这两者怎么区分? (ps:closesocket 过N久后,select也会返回1,表示一个可读事件,读取recv返回0,表示断开)
使用lwip中的select(即关闭sal和dfs组件)
应用线程主动closesocket 时,select返回1,代表有一个可读事件,读取recv返回0,表示断开。
你有测试代码吗?能否提供一下?还是基于tcpclient测试的?
hi neverxie !
使用sal+dfs中的select,是基于tcpclient代码测试的,因为tcpclient中提供了rt_tcpclient_close()这样的API,我就随手测试用了一下。
一个简单粗暴的测试方法如下:(这样测试会引起断言,仅当测试效果而已)
- 在tcpclient_example.c加入以下代码,主动关闭tcpclient
void tcpc_close(void)
{
rt_event_send(tc_event, TC_TCPCLIENT_CLOSE);
}
#include "finsh.h"
MSH_CMD_EXPORT(tcpc_close, colse tcp client);
- 在tcpclient.c中查看select返回值
res = select(max_fd, &fds, RT_NULL, RT_NULL, RT_NULL);
rt_kprintf("select res = %d\r\n", res);
PS:我用的是lwIP v2.0.2版本
测试结果如下:

PS:我没有开启EasyLogger组件,打印是用了rt_kprintf()适配了EasyLogger相关打印宏
应用场景: 应用程序可能检测到类似睡眠或者关闭条件,需要主动关闭连接(例如可通过select超时来检测)。
关于疑问: 为啥主动close后select返回0? 设置select超时后也是返回0,这两者又如何区分?
另一种是不开启sal和dfs组件,使用lwip中的select,测试时没有基于tcpclient代码 只是写了一个select的处理机制,和tcpclient中雷同,去除了pipe而已 测试结果是返回1。读recv,返回0