tcpclient icon indicating copy to clipboard operation
tcpclient copied to clipboard

closesocket 与 select 返回值的问题

Open FlyLu opened this issue 7 years ago • 2 comments

使用sal+dfs中的select

应用线程主动closesocket 时,select返回0,但select设置超时后也返回0,这两者怎么区分? (ps:closesocket 过N久后,select也会返回1,表示一个可读事件,读取recv返回0,表示断开)

使用lwip中的select(即关闭sal和dfs组件)

应用线程主动closesocket 时,select返回1,代表有一个可读事件,读取recv返回0,表示断开。

FlyLu avatar Aug 30 '18 13:08 FlyLu

你有测试代码吗?能否提供一下?还是基于tcpclient测试的?

lepustse avatar Aug 31 '18 14:08 lepustse

hi neverxie !

使用sal+dfs中的select,是基于tcpclient代码测试的,因为tcpclient中提供了rt_tcpclient_close()这样的API,我就随手测试用了一下。

一个简单粗暴的测试方法如下:(这样测试会引起断言,仅当测试效果而已)

  1. 在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);
  1. 在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版本

测试结果如下: image

PS:我没有开启EasyLogger组件,打印是用了rt_kprintf()适配了EasyLogger相关打印宏

应用场景: 应用程序可能检测到类似睡眠或者关闭条件,需要主动关闭连接(例如可通过select超时来检测)。

关于疑问: 为啥主动close后select返回0? 设置select超时后也是返回0,这两者又如何区分?

另一种是不开启sal和dfs组件,使用lwip中的select,测试时没有基于tcpclient代码 只是写了一个select的处理机制,和tcpclient中雷同,去除了pipe而已 测试结果是返回1。读recv,返回0

FlyLu avatar Sep 01 '18 09:09 FlyLu