Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
AT
EC20
at socket驱动状态机缺失“CLOSE_WAIT”状态
发布于 2021-11-16 18:03:26 浏览:1200
订阅该版
[tocm] # at socket驱动状态机缺失“CLOSE_WAIT”状态 - **硬件**:EC20+STM32F4 - **现象**:在at socket驱动客户端与服务器建立TCP连接后,如果服务器端主动发起断开连接信息,at socket驱动就会执行关闭任务。但是socket连接还保持在4G模块中; 如果at socket驱动客户端使用相同的socket:ID再一次建立连接时,EC20会返回563的错误码(如下图所示)。需要向EC20发送 “close” 命令后,才可以再次使用。 ![image-20211116144037138.png](https://oss-club.rt-thread.org/uploads/20211116/1a0fe44ffe4014a79e5ac6652810da4a.png.webp) - **分析原因**:RT-Thread在收到服务器的断开信息后,直接将socket的状态设置为“AT_SOCKET_CLOSED”状态,而这个状态会导致at socket驱动客户端跳过向EC20发送“close”关闭指令的流程。 这是因为:RT-Thread在定义socket的状态机时,缺少“CLOSE_WAIT”(TCP协议状态机内容)这个状态,而是直接使用了“CLOSED”状态。 以下为RT-Thread的at socket驱动库中的状态枚举。 ~~~c /* Current state of the AT socket. */ enum at_socket_state { AT_SOCKET_NONE, AT_SOCKET_OPEN, AT_SOCKET_LISTEN, AT_SOCKET_CONNECT, AT_SOCKET_CLOSED }; ~~~ - **导致结果**:RT-Thread客户端在使用相同的socket:ID再一次建立连接时,EC20会返回563的错误码(如下图所示)。需要向EC20发送“close”命令后,才可以再次使用。 是否有其它风险暂时未知。
查看更多
3
个回答
默认排序
按发布时间排序
crystal266
2022-03-09
嵌入式
你好,我试了一下打印的日志如下所示,在服务器主动断开连接后,URC回调函数会将当前的 sock_fd 的状态设置为 CLOSE,然后没有清除模组内部的 sock_fd。但是再一次执行 connect 函数时,发现模组内部的 sock_fd 处于未关闭状态,会执行模组的 sock_fd 关闭函数 ec200x_socket_close(),这样就不会存在模组内部的 sock_fd 未关闭的情况了。 ![image.png](https://oss-club.rt-thread.org/uploads/20220309/7e2470451c33c3c0017696129269bc4f.png.webp) 连接的源码如下: ``` /** * create TCP/UDP client or server connect by AT commands. * * @param socket current socket * @param ip server or client IP address * @param port server or client port * @param type connect socket type(tcp, udp) * @param is_client connection is client * * @return 0: connect success * -1: connect failed, send commands error or type error * -2: wait socket event timeout * -5: no memory */ static int ec200x_socket_connect(struct at_socket *socket, char *ip, int32_t port, enum at_socket_type type, rt_bool_t is_client) { #define CONN_RETRY 2 int i = 0; const char *type_str = RT_NULL; uint32_t event = 0; at_response_t resp = RT_NULL; int result = 0, event_result = 0; int device_socket = (int) socket->user_data; struct at_device *device = (struct at_device *) socket->device; RT_ASSERT(ip); RT_ASSERT(port >= 0); if ( ! is_client) { return -RT_ERROR; } switch(type) { case AT_SOCKET_TCP: type_str = "TCP"; break; case AT_SOCKET_UDP: type_str = "UDP"; break; default: LOG_E("%s device socket(%d) connect type error.", device->name, device_socket); return -RT_ERROR; } resp = at_create_resp(128, 0, rt_tick_from_millisecond(300)); if (resp == RT_NULL) { LOG_E("no memory for resp create."); return -RT_ENOMEM; } for(i=0; i
client, resp, "AT+QIOPEN=1,%d,\"%s\",\"%s\",%d,0,1", device_socket, type_str, ip, port) < 0) { result = -RT_ERROR; break; } /* waiting result event from AT URC, the device default connection timeout is 60 seconds*/ if (ec200x_socket_event_recv(device, SET_EVENT(device_socket, 0), 60 * RT_TICK_PER_SECOND, RT_EVENT_FLAG_OR) < 0) { LOG_E("%s device socket(%d) wait connect result timeout.", device->name, device_socket); result = -RT_ETIMEOUT; break; } /* waiting OK or failed result */ event_result = ec200x_socket_event_recv(device, EC200X_EVENT_CONN_OK | EC200X_EVENT_CONN_FAIL, 1 * RT_TICK_PER_SECOND, RT_EVENT_FLAG_OR); if (event_result < 0) { LOG_E("%s device socket(%d) wait connect OK|FAIL timeout.", device->name, device_socket); result = -RT_ETIMEOUT; break; } /* check result */ if (event_result & EC200X_EVENT_CONN_OK) { result = RT_EOK; break; } LOG_D("%s device socket(%d) connect failed, the socket was not be closed and now will connect retry.", device->name, device_socket); if (ec200x_socket_close(socket) < 0) { result = -RT_ERROR; break; } } if (i == CONN_RETRY) { LOG_E("%s device socket(%d) connect failed.", device->name, device_socket); result = -RT_ERROR; } if (resp) { at_delete_resp(resp); } return result; } ```
aozima
2021-11-16
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
是否可以强制close,不然还得维持并刷新这个状态。
xiangxistu
2021-11-17
这家伙很懒,什么也没写!
close wait 状态,是 TCP 里的一个状态。 但是这个状态并不是必须的,``close wait``状态的保持时间在不同网络协议栈之间的实现也不完全一致。甚至于 EC20 的处理方式在其他模块中的处理逻辑也不完全一致。 ---- 申请不到,返回 563 。这个逻辑,你可以添加在 ec20 的 ```ec20_socket_connect``` 逻辑中做处理,如果是在 at socket 这个状态下维持这个短暂的状态,不通用。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.2k
关于作者
忧伤还是快乐
这家伙什么也没写,不是懒
提问
17
回答
7
被采纳
0
关注TA
发私信
相关问题
1
rt-thread 2g/3g/4g通信模块的教程有吗?
2
基于AT指令,用esp8266如何连接mqtt?
3
AT组件使用问题
4
官方AT客户端应用笔记的几个小tip
5
RTT的SAL能够判断使用LWIP或者AT?
6
rt_therad AT组件移植不成功(结贴)
7
AT组件在哪个版本的?
8
AT组件 连接 Onenet 连接失败
9
esp8266 AT指令 MQTT连接问题
10
AT组件使用问题之模块主动上报【已解决】
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部