C++ 绑定端点时的asio绑定异常

C++ 绑定端点时的asio绑定异常,c++,sockets,boost,boost-asio,C++,Sockets,Boost,Boost Asio,我使用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_bac

我使用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));
}
它很好用。服务器::在新客户端连接时处理\接受调用。 但我想连接到任意端点。我将绑定添加到此端点。Acceptor是类成员。sockets是asio套接字的共享ptr数组。 如果我只加上:

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。

我终于解决了这个问题。我删除了接受程序并创建了一个新的接受程序。现在的接受器是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");
}

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