C++ 绑定端点时的asio绑定异常
我使用boost::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
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);。换句话说,我在这里更改了端口,我想监听来自它的连接。