• 使用boost库,无法释放udp端口的问题


    在使用boost的socket封装库的时候,遇见一个奇怪的问题,就是关闭boost的udp socket,但是 udp的端口一直没有释放,这是一个很严重的问题,因为对于服务器来讲,由于一直运行,端口没释放会导致端口越来越少吗,最后没端口用

    代码如下

    trans_redirect_socket->close();
    trans_redirect_socket->shutdown(boost::asio::ip::udp::socket::shutdown_both);

    网上说要配置地址可重用,于是试了一把

                int nNetTimeout = 3;
                
                result = setsockopt(native_sock, SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout, sizeof(int));
                result = setsockopt(native_sock, SOL_SOCKET, SO_REUSEADDR, (char *)&nNetTimeout, sizeof(int));
                BOOL  bDontLinger = FALSE;
                setsockopt(native_sock, SOL_SOCKET, SO_DONTLINGER, (const char*)&bDontLinger, sizeof(BOOL));

    一样的没办法释放

    后来发觉closesocket可以正常的释放

    可是boost::shared_ptr<boost::asio::ip::udp::socket>不能直接处理,后来找到一个方法转化成本地socket

    closesocket(it->second->trans_redirect_socket->native());

    于是就能正常释放udp端口了

    ·····································

    更新

    trans_redirect_socket->shutdown(boost::asio::ip::udp::socket::shutdown_both);
    trans_redirect_socket->close();

    这样也是可以的

    trans_redirect_socket->shutdown(boost::asio::ip::udp::socket::shutdown_both);是关闭接收发送资源,就像家里的灯的开关,只是关闭,还可以打开,电源还在,开关还在,没有完全销毁
    trans_redirect_socket->close();关闭socket,就相当于把家里的开关直接拆了,拆了除非你重新安装一个开关,才能使用

  • 相关阅读:
    纳尼?不用码代码,就可回归主流程,一只海豚就可以做到
    教育产品-组件化视觉设计实践
    从整理看视觉设计(网易云课堂我的学习中心-微专业视觉优化)
    搜索意图识别浅析
    如何配置使用Dnsmasq
    如何实现最佳的跨平台游戏体验?Unity成亮解密实时渲染技术!
    PAT 1024. Palindromic Number
    PAT 1023. Have Fun with Numbers
    PAT 1022. Digital Library
    PAT 1021. Deepest Root
  • 原文地址:https://www.cnblogs.com/baldermurphy/p/7388769.html
Copyright © 2020-2023  润新知