主要是用于 电脑端网线 掉线检测
测试条件:
使用的时tcp server 非阻塞的方式进行收发 和 主动发送 的
参考的文章:多线程非阻塞网络编程
只不过我改成了tcp server 模式
设置超时时间
W5500即使不设置,也存在一个初始的超时时间,手册里写的200ms,但我读取测试发现是2s
(本来想用 setsockopt 进行设置,发现没有效果,应该是没适配W5500,所以这里采用直接设置 W5500里的超时寄存器)
设置一个单独线程,用于主动发送数据到客户端
static void tcpserv_send(void arg)
{
RT_ASSERT(arg);
rt_netfd_t thiz = arg;
rt_uint16_t len;
char send_buf[256];
while(1)
{
rt_sprintf(send_buf, "RTR:%d, RCT:%d", getRTR(), getRCR());
len = rt_strlen(send_buf);
write(thiz->pipe_send_fd[1], send_buf, len);
rt_thread_mdelay(1000);
}
}
bug情景再现:
第一阶段,测试的是手动关闭socket,重连后连接正常,通讯都正常
第二阶段,测试的是电脑端网线拔掉后2s内接回,结果同上
第三阶段,测试的是电脑端网线拔掉后 直到W5500 自动关闭
socket,结果发现重连后 W5500能往外发送数据,却无法接收数据,且任何中断不响应了。
手册中断说明:
这里结果很明显了,应该是响应了发送超时中断,却未进行清除,导致所有中断都无法响应了
解决办法:
在发送的过程中如果检测到了 socket关闭,还需增加:判断一下是否是发送超时,是的话清零
再次实验: 所有情况都正常,且能实现电脑端的网线 掉线检测
更多回帖