如何使用boost asio将端口正确随机分配给测试HTTP服务器

How do I correctly randomly assign a port to a test HTTP server using boost asio?

本文关键字:分配 随机 测试 服务器 HTTP boost 何使用 asio      更新时间:2023-10-16

我正在使用boost asio创建一个测试服务器来测试http客户端。这将与客户端在同一台计算机上运行。现在我想做的是创建一个带有随机分配端口的服务器。我在这里看到了这个线程:使用boost::asio有一种便携式的方法可以找到空闲端口号,但坦率地说,我仍然有点困惑。

我的代码看起来像这样:

boost::asio::io_service service;
tcp::acceptor acceptor(service);
unsigned short port(0);
tcp::endpoint endPoint(tcp::endpoint(tcp::v4(), port);
acceptor.open(endPoint.protocol());
acceptor.set_option(tcp::acceptor::reuse_address(true));
acceptor.bind(endPoint);
port = endPoint.port();
std::cout<<port<<std::endl; // prints 0

我的想法是,通过创建一个具有"端口0"的端点,然后尝试绑定到该端口,应该会随机分配一个可用端口,但事实并非如此。知道我做错了什么吗?

干杯。

boost::asio::io_service service;
boost::asio::ip::tcp::acceptor acceptor(service);
unsigned short port(0);
boost::asio::ip::tcp::endpoint endPoint(tcp::endpoint(tcp::v4(), port);
acceptor.open(endPoint.protocol());
acceptor.set_option(tcp::acceptor::reuse_address(true));
acceptor.bind(endPoint);
m_acceptor.listen();        
boost::asio::ip::tcp::endpoint le = acceptor.local_endpoint(); //THIS LINE SOLVES IT
port = le.port();
// port = endPoint.port(); // This is didn't work for me

有用的答案类似问题

您可以通过为受体使用不同的构造函数来缩短此过程:

using boost::asio;
io_service service;
ip::tcp::acceptor acceptor(service, ip::tcp::endpoint(ip::tcp::v4(), 0));
unsigned short port = acceptor.local_endpoint().port();

此构造函数在接收器上调用open()、bind()和listen()。

已修复。我需要做:

boost::asio::io_service service;
tcp::acceptor acceptor(service);
unsigned short port(0);
tcp::endpoint endPoint(tcp::endpoint(tcp::v4(), port);
acceptor.open(endPoint.protocol());
acceptor.set_option(tcp::acceptor::reuse_address(true));
acceptor.bind(endPoint);
m_acceptor.listen();        // NEEDED TO ADD THIS BIT!
port = endPoint.port();
std::cout<<port<<std::endl; // prints 0