【问题标题】:How do I correctly randomly assign a port to a test HTTP server using boost asio?如何使用 boost asio 正确地将端口随机分配给测试 HTTP 服务器?
【发布时间】:2013-08-13 12:56:35
【问题描述】:

我正在使用 boost asio 创建一个测试服务器来测试一个 http 客户端。这将在与客户端相同的机器上运行。现在我想做的是创建一个随机分配端口的服务器。我在这里看过这个帖子:Using boost::asio is there a portable way to find out free port number 但坦率地说我还是有点困惑。

我的代码如下所示:

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”创建一个端点,然后尝试绑定到该端口,它应该会导致一个可用端口被随机分配,但情况似乎并非如此。知道我做错了什么吗?

干杯。

【问题讨论】:

    标签: c++ sockets network-programming boost-asio


    【解决方案1】:
    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
    

    Helpful answer Similar question

    【讨论】:

      【解决方案2】:

      您可以通过为接受器使用不同的构造函数来缩短它:

      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()。

      【讨论】:

        【解决方案3】:

        已修复。我需要做的:

        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
        

        【讨论】:

        • 你的 sn-p 说 prints 0,所以它打印 0,我虽然你希望它打印非零随机端口?
        • 我认为你的答案不正确,你应该接受以上答案之一。
        猜你喜欢
        • 2014-06-15
        • 2011-06-27
        • 2014-10-10
        • 1970-01-01
        • 2018-09-26
        • 2020-11-06
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        相关资源
        最近更新 更多