-
Notifications
You must be signed in to change notification settings - Fork 5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[components][net]at_socket.c文件中socket掉线后,不能关闭socket #9613
base: master
Are you sure you want to change the base?
Conversation
没看懂。。。是条件判断不过导致哪个地方不能执行?不能释放资源? |
我用的ec20做的测试,当ec20的socket掉线,会调用函数at_closed_notice_cb,在这个函数中设置socket状态为关闭状态sock->state = AT_SOCKET_CLOSED,但是这个时候socket并未关闭,之后调用函数closesocket(最后调用函数at_closesocket)关闭这个socket,这个时候无法关闭,因为在at_closesocket函数中会判断socket是否为关闭状态,之前掉线的时候已经设置socket为关闭状态了 |
是的,在函数at_closesocket条件判断不过,导致资源不能释放。 |
明白了EC20模组自动断开后需要手动调用AT+CLOSE来关闭模组内部资源。但有些模组自动断开后会自动释放内部资源,如果又手动关闭会返回错误。增加这个状态不能完全解决这个问题。建议这样改: int at_closesocket(int socket)
{
struct at_socket *sock = RT_NULL;
/* deal with TCP server actively disconnect */
rt_thread_delay(rt_tick_from_millisecond(100));
sock = at_get_socket(socket);
if (sock == RT_NULL)
{
rt_set_errno(ENXIO);
return -1;
}
if (sock->ops->at_closesocket(sock) != 0) // 直接调用模组驱动,由模组自己判断要不要关闭
{
free_socket(sock);
rt_set_errno(EIO);
return -1;
}
free_socket(sock);
return 0;
}
int module_socket_close(struct at_socket *socket)
{
if (socket->state == AT_SOCKET_CLOSED)
{
return RT_EOK; // 对于socket断开自动释放的模组,直接返回。
}
// 对于socket断开需要手动释放的模组,比如ec20,手动调用
at_obj_exec_cmd("AT+CLOSE");
} 不过这样改了模组驱动都需要看下需不需要更新适配下 |
拉取/合并请求描述:(PR description)
[
为什么提交这份PR (why to submit this PR)
at_socket.c文件中socket掉线后,不能关闭socket
你的解决方案是什么 (what is your solution)
增加socket掉线状态
请提供验证的bsp和config (provide the config and bsp)
]
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
#if 0
代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up