嵌入式技术论坛
直播中

李敏

7年用户 1360经验值
私信 关注
[问答]

EC20使用AT socket进行通信时服务器主动断开连接怎么处理这种情况?

在使用EC20进行通信中,如果服务器主动断开连接,此时,程序中无任何异常提示,recv函数中也不会返回0或负数,而到下次程序发送数据时,就会报错或导致系统死机。
请问,这种情况有什么比较好的处理方法?


回帖(7)

王磊

2023-2-14 11:11:16
TCP长连接,应用层有没有周期性的心跳包去确认网络连接状态呢
举报

王丽

2023-2-14 11:11:30
服务器主动断开连接应该会有Socket断开连接的URC消息上报的
举报

李敏

2023-2-14 11:11:38
我测试了,EC20确实有发出+QIURC: “closed”,0,AT socket也有处理,但是没有异常上报到应用层,所以应用层不知道连接已经断开了,下次发送数据就报错了。
举报

王丽

2023-2-14 11:11:45
既然AT socket已经处理了,那应用层就应该要有判断机制检查连接是否断开。你这个问题就是应用层的健壮性不够,没有考虑所有网络连接的可能性。
举报

李敏

2023-2-14 11:11:57
2.jpg
应用层是这样处理的,但是EC20的AT Socket在服务端断开连接后,recv里面仍然是阻塞的,没有等于0和小于0的异常返回值。
举报

王丽

2023-2-14 11:12:10
那你这个应该是没设置recv的最大阻塞时间,你看一下at_socket.c里面的at_recvfrom的实现

    /* set AT socket receive timeout */
    if ((timeout = sock->recv_timeout) == 0)
    {
        timeout = RT_WAITING_FOREVER;
    }
    else
    {
        timeout = rt_tick_from_millisecond(timeout);
    }
举报

dianzi

2023-2-14 15:58:35
1. 可以考虑使用心跳机制,定期发送心跳包,以检测服务器是否断开连接。
2. 可以考虑使用超时机制,设置一个超时时间,如果在超时时间内没有收到服务器的响应,则认为服务器已断开连接。
3. 可以考虑使用异常处理机制,当发生异常时,可以捕获异常,并进行相应的处理。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分