【问题标题】:How can I make it so that the program won't bind to an already in use port?我怎样才能使程序不会绑定到已经使用的端口?
【发布时间】:2014-07-21 14:27:49
【问题描述】:

我正在使用下面的代码打开一个 Boost Asio 接受器。我希望当我打开程序的第二个实例时,新实例将无法绑定到已经使用的端口 8080。不过,我发现实际上从未抛出异常。我怎样才能使程序不会绑定到已经使用的端口?

这是在 Windows 7 机器上运行的。

boost::shared_ptr<asio_ip::tcp::acceptor> acceptor;

try {
    acceptor.reset(new asio_ip::tcp::acceptor(io_service, asio_ip::tcp::endpoint(asio_ip::tcp::v4(), 8080)));
}
catch (...) {
    acceptor.reset(new asio_ip::tcp::acceptor(io_service, asio_ip::tcp::endpoint(asio_ip::tcp::v4(), 0)));
}

【问题讨论】:

  • 如果你明确禁用reuse_address会发生什么?
  • 是的!工作。如果您将其作为答案并指定如何操作,我会接受。
  • 答案已添加!

标签: c++ windows boost boost-asio


【解决方案1】:

您可能需要明确禁用reuse_address,因为我不确定这是否在 Windows 平台上默认启用。这可以按如下方式完成:

boost::asio::ip::tcp::acceptor acceptor(io_service);
...
boost::asio::socket_base::reuse_address option(false);
acceptor.set_option(option);

【讨论】:

  • 原始代码中使用的constructor 重载有一个可选的reuse_addr 参数,默认为true
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 2013-12-29
  • 1970-01-01
  • 2023-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多