Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
at_socket
5
at_socket中服务器主动断开连接导致后续操作异常
发布于 2022-02-21 18:52:37 浏览:1343
订阅该版
该问题和 [at socket驱动状态机缺失“CLOSE_WAIT”状态](https://club.rt-thread.org/ask/question/433591.html) 较类似,使用at_socket与服务器建立连接后,服务器主动断开连接后,此时装置会调用该函数: ```c static void at_closed_notice_cb(struct at_socket *sock, at_socket_evt_t event, const char *buff, size_t bfsz) { RT_ASSERT(event == AT_SOCKET_EVT_CLOSED); /* check the socket object status */ if (sock->magic != AT_SOCKET_MAGIC) { return; } at_do_event_changes(sock, AT_EVENT_RECV, RT_TRUE); at_do_event_changes(sock, AT_EVENT_ERROR, RT_TRUE); sock->state = AT_SOCKET_CLOSED; rt_sem_release(sock->recv_notice); } ``` 该函数中将at_socket的状态置为AT_SOCKET_CLOSED,但是却没有调用相应的close函数。后续代码中判断该链接为异常后,调用at_closesocket去执行关闭操作时,只执行了free_socket(),并未调用`sock->ops->at_closesocket`(本处即ec200x_socket_close),因此4G模块中还保持着该socket连接。 ```c int at_closesocket(int socket) { struct at_socket *sock = RT_NULL; enum at_socket_state last_state; /* deal with TCP server actively disconnect */ rt_thread_delay(rt_tick_from_millisecond(100)); sock = at_get_socket(socket); if (sock == RT_NULL) { return -1; } /* 不太理解为何使用该变量 */ last_state = sock->state; /* the rt_at_socket_close is need some time, so change state in advance */ sock->state = AT_SOCKET_CLOSED; if (last_state != AT_SOCKET_CLOSED) { /* 当服务器主动断开连接后,at_closed_notice_cb已将状态置为AT_SOCKET_CLOSED,因此这部分代码都不会执行 */ if (sock->ops->at_closesocket(sock) != 0) { free_socket(sock); return -1; } } free_socket(sock); return 0; } static int ec200x_socket_close(struct at_socket *socket) { int result = RT_EOK; at_response_t resp = RT_NULL; int device_socket = (int) socket->user_data; struct at_device *device = (struct at_device *) socket->device; resp = at_create_resp(64, 0, rt_tick_from_millisecond(300)); if (resp == RT_NULL) { LOG_E("no memory for resp create."); return -RT_ENOMEM; } result = at_obj_exec_cmd(device->client, resp, "AT+QICLOSE=%d", device_socket); at_delete_resp(resp); return result; } ``` 此外,还想问一下```at_closesocket```函数中```last_state```这一变量,是出于何种考虑添加该变量,较为困惑。
查看更多
crystal266
2022-02-21
嵌入式
我觉得这点的处理逻辑有点问题,应该在 服务器主动断开连接的回调函数里面设置一个中间状态,然后在close函数中关闭AT模组的socket服务,从而释放掉该socketID,要不然再用这个sockedID进行连接的话模组会返回错误码。 或者直接在服务器主动断开连接的回调函数里面调用`sock->ops->at_closesocket`,关闭模组的socket服务,这样`at_closesocket()`函数按照现在的逻辑直接`free_socket(sock)`也行。 --- 源码的逻辑我猜是正常连接时主动关闭调用 sock->ops->at_closesocket 发送AT指令给模组,关闭模组的socket服务,释放掉该socketID。当前已经关闭的话,就不想让给模组发送AT指令关闭模组的socket服务了,默认关闭了模组的socket服务(但是忽略了现在代码执行服务器主动断开连接的回调函数里面的逻辑) ```c if (last_state != AT_SOCKET_CLOSED) { /* 当服务器主动断开连接后,at_closed_notice_cb已将状态置为AT_SOCKET_CLOSED,因此这部分代码都不会执行 */ if (sock->ops->at_closesocket(sock) != 0) { free_socket(sock); return -1; } } ``` 另外,我觉得当前处于正常状态连接状态下,主动关闭模组的socket服务时,如果执行失败,是不应该执行 free_socket() 的吧,要不然 free_socket() 后,模组还没关闭socket服务,又可能会造成使用相同的socketID进行连接的问题了。 --- 按照现在的源码,参考文中提到的那个帖子,根据返回的结果来判断是否需要关闭模组的socket服务更稳妥一些,就是稍微麻烦一点。 --- 附上关闭socket服务相应的AT指令 和 收到关闭URC消息的相关解释(收到该消息后应该主动发送 AT+QICLOSE=
指令去关闭 socket 模组的服务) ![image.png](https://oss-club.rt-thread.org/uploads/20220221/dea436ef56b222ca9de5f84e62a14476.png.webp) ![image.png](https://oss-club.rt-thread.org/uploads/20220221/e8990cee2daa5f57c80b8b3730332e75.png.webp)
1
个回答
默认排序
按发布时间排序
撰写答案
登录
注册新账号
关注者
0
被浏览
1.3k
关于作者
樂飓颩俠
抱大腿
提问
10
回答
3
被采纳
0
关注TA
发私信
相关问题
1
这个at_device初始联网等操作为什么要在main函数之前呢?
2
关与AT client几个操作函数的问题
3
服务器重启后,socket如何进行重连?
4
ntp服务器无法同步问题
5
ntp与mqtt同时使用时出现socket(1)连接超时。
6
AT Socket 支持的 API 不完整,没有实现 accept
7
使用at_socket 怎么完成的创建socket
8
AT socket 接收较长数据 的问题
9
AT Socket 功能启动时报错
10
sal_socket.c 报错
推荐文章
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
使用RC522软件包驱动FM1722
2
常量数据类型和表达式陷阱分享
3
进行i2c驱动移植的经验总结
4
在VSCode中使用clang-format
5
我该如何使用这个微雪的WIFI400 WIFI-LPB-100在rtt里或者我该怎样为它开发驱动
热门标签
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
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
289
次被采纳
张世争
809
个答案
175
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部