Skip to content
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

Open
wants to merge 12 commits into
base: master
Choose a base branch
from

Conversation

youzuwei
Copy link
Contributor

@youzuwei youzuwei commented Nov 4, 2024

拉取/合并请求描述:(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)

  • BSP:bsp/stm32/stm32/stm32f429-atk-apollo
  • .config:
  • action:

]

当前拉取/合并请求的状态 Intent for your PR

必须选择一项 Choose one (Mandatory):

  • 本拉取/合并请求是一个草稿版本 This PR is for a code-review and is intended to get feedback
  • 本拉取/合并请求是一个成熟版本 This PR is mature, and ready to be integrated into the repo

代码质量 Code Quality:

我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:

  • 已经仔细查看过代码改动的对比 Already check the difference between PR and old code
  • 代码风格正确,包括缩进空格,命名及其他风格 Style guide is adhered to, including spacing, naming and other styles
  • 没有垃圾代码,代码尽量精简,不包含#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up
  • 所有变更均有原因及合理的,并且不会影响到其他软件组件代码或BSP All modifications are justified and not affect other components or BSP
  • 对难懂代码均提供对应的注释 I've commented appropriately where code is tricky
  • 代码是高质量的 Code in this PR is of high quality
  • 已经使用formatting 等源码格式化工具确保格式符合RT-Thread代码规范 This PR complies with RT-Thread code specification
  • 如果是新增bsp, 已经添加ci检查到.github/workflows/bsp_buildings.yml 详细请参考链接BSP自查

@yangpengya
Copy link
Contributor

没看懂。。。是条件判断不过导致哪个地方不能执行?不能释放资源?

@youzuwei
Copy link
Contributor Author

youzuwei commented Nov 4, 2024

我用的ec20做的测试,当ec20的socket掉线,会调用函数at_closed_notice_cb,在这个函数中设置socket状态为关闭状态sock->state = AT_SOCKET_CLOSED,但是这个时候socket并未关闭,之后调用函数closesocket(最后调用函数at_closesocket)关闭这个socket,这个时候无法关闭,因为在at_closesocket函数中会判断socket是否为关闭状态,之前掉线的时候已经设置socket为关闭状态了

@youzuwei
Copy link
Contributor Author

youzuwei commented Nov 4, 2024

是的,在函数at_closesocket条件判断不过,导致资源不能释放。
也有可能我理解的有问题。

@yangpengya
Copy link
Contributor

yangpengya commented Nov 5, 2024

我用的ec20做的测试,当ec20的socket掉线,会调用函数at_closed_notice_cb,在这个函数中设置socket状态为关闭状态sock->state = AT_SOCKET_CLOSED,但是这个时候socket并未关闭,之后调用函数closesocket(最后调用函数at_closesocket)关闭这个socket,这个时候无法关闭,因为在at_closesocket函数中会判断socket是否为关闭状态,之前掉线的时候已经设置socket为关闭状态了

明白了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");
}

不过这样改了模组驱动都需要看下需不需要更新适配下

@youzuwei youzuwei closed this Nov 5, 2024
@youzuwei youzuwei reopened this Nov 5, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants