boost::asio 绑定端点时绑定异常
boost::asio bind exception when binding a endpoint
我使用 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 在新客户端连接时调用。
但我想连接到任意端点。然后我将绑定添加到此端点。接受者是 class 成员。 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));
}
但我也一样。
那么,我怎样才能重用接受器重新绑定到一个新地址呢?
OS 是 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");
}
我使用 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 在新客户端连接时调用。 但我想连接到任意端点。然后我将绑定添加到此端点。接受者是 class 成员。 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));
}
但我也一样。 那么,我怎样才能重用接受器重新绑定到一个新地址呢? OS 是 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");
}