使用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,就相当于把家里的开关直接拆了,拆了除非你重新安装一个开关,才能使用

 

转载于:https://www.cnblogs.com/baldermurphy/p/7388769.html

首先需要下载Boost,并在VS中配置Boost的路径。 接下来,可以按照以下步骤实现UDP通信: 1. 引入头文件和命名空间 ```cpp #include <iostream> #include <boost/asio.hpp> using namespace boost::asio; ``` 2. 创建io_service对象 ```cpp io_service service; ``` 3. 创建UDP socket ```cpp ip::udp::socket socket(service); ``` 4. 绑定端口号 ```cpp ip::udp::endpoint endpoint(ip::udp::v4(), port); socket.open(endpoint.protocol()); socket.bind(endpoint); ``` 其中`port`为要绑定的端口号。 5. 接收数据 ```cpp char buffer[1024]; ip::udp::endpoint sender_endpoint; socket.receive_from(buffer, 1024, sender_endpoint); std::cout << "Received data: " << buffer << std::endl; ``` `receive_from`函数会阻塞等待接收数据,并将发送方的IP和端口信息存储在`sender_endpoint`中。 6. 发送数据 ```cpp char data[] = "Hello, world!"; ip::udp::endpoint receiver_endpoint(ip::address::from_string("127.0.0.1"), port); socket.send_to(buffer(data), receiver_endpoint); ``` 其中`receiver_endpoint`为要发送到的IP和端口信息。 完整代码示例: ```cpp #include <iostream> #include <boost/asio.hpp> using namespace boost::asio; int main() { io_service service; ip::udp::socket socket(service); int port = 12345; ip::udp::endpoint endpoint(ip::udp::v4(), port); socket.open(endpoint.protocol()); socket.bind(endpoint); char buffer[1024]; ip::udp::endpoint sender_endpoint; socket.receive_from(buffer, 1024, sender_endpoint); std::cout << "Received data: " << buffer << std::endl; char data[] = "Hello, world!"; ip::udp::endpoint receiver_endpoint(ip::address::from_string("127.0.0.1"), port); socket.send_to(buffer(data), receiver_endpoint); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值