【问题标题】:boost::asio bind exception when binding a endpoint绑定端点时的 boost::asio 绑定异常
【发布时间】:2015-06-21 11:29:35
【问题描述】:

我使用 boost::asio 创建了一个服务器。而且我在绑定到端点时遇到问题。 所以,如果我在构造函数中初始化一个接受器:

Server::Server(QWidget *parent) : QDialog(parent), acceptor(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 5555))

使用后:

void Dialog::start_accept()
{
sockets.push_back(socket_ptr(new boost::asio::ip::tcp::socket(io_service)));
acceptor.async_accept(*(sockets[sockets.size() - 1]), boost::bind(&Server::handle_accept, this, sockets[sockets.size() - 1], _1));
}

它工作正常。 Server::handle_accept 在新客户端连接时调用。 但我想连接到任意端点。我将绑定添加到此端点。接受者是一个类成员。 sockets 是一个 shared_ptr 到 asio 套接字的数组。 如果我只添加:

void Server::start_accept()
{
sockets.push_back(socket_ptr(new boost::asio::ip::tcp::socket(io_service)));
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 4444);
acceptor.bind(endpoint);
acceptor.async_accept(*(sockets[sockets.size() - 1]), boost::bind(&Dialog::handle_accept, this, sockets[sockets.size() - 1], _1));
}

我得到异常错误的论点。我试试:

void Server::start_accept()
{
sockets.push_back(socket_ptr(new boost::asio::ip::tcp::socket(io_service)));
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 4444);
acceptor.close();
acceptor.open(endpoint.protocol());
acceptor.bind(endpoint);
acceptor.async_accept(*(sockets[sockets.size() - 1]), boost::bind(&Server::handle_accept, this, sockets[sockets.size() - 1], _1));
}

但我也一样。 那么,我怎样才能重用接受器来重新绑定到一个新地址呢? 操作系统是 Ubuntu 14.04。

【问题讨论】:

  • 你可以在这里看到它github.com/denprog/CameraServer
  • 这是一个有效的。但我想在 start_accept() 中绑定一个新的端点。
  • 定义“任意端点”。
  • 这是一个端点,我在 start_accept 中定义了地址和端口: boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4 (), 4444);.换句话说,我在这里更改了端口,我想监听它的连接。

标签: c++ sockets boost boost-asio


【解决方案1】:

最后我解决了这个问题。我删除了接受者并创建了一个新接受者。现在接受器是 boost::scoped_ptr 接受器。

try
{
    if (acceptor && acceptor->is_open())
    {
        acceptor->cancel();
        acceptor->close();
    }
    acceptor.reset(new boost::asio::ip::tcp::acceptor(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), arg1.toInt())));
    acceptor->set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
}
catch (const boost::system::system_error& error)
{
    add_log("Error accepting");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    相关资源
    最近更新 更多