我正在使用boost.asio,并且我有一个需要处理多个连接的简单服务器。在开始“连接”状态之前,我需要在有限的时间内与客户进行握手。我为握手的每一步使用了链式异步操作,因为我需要使用定时器和(据我所知我无法在同步读取和写入时执行此操作)。我需要一种方法来阻止每个连接,直到截止日期计时器结束或握手成功,而不会阻塞服务器。asio - 等待异步操作完成
有什么办法可以达到这个目的吗?
UPDATE一些代码,以澄清事情
一个简单服务器
typedef boost::asio::ip::tcp::socket sock;
class server
{
public:
server() : _ios(), _acceptor(_ios)
{
boost::asio::ip::tcp::resolver resolver(_ios);
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), PORT);
_acceptor.open(endpoint.protocol());
_acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
_acceptor.bind(endpoint);
_acceptor.listen();
do_accept();
}
void run()
{
_ios.run();
}
private:
void do_accept()
{
auto socket = std::make_shared<TSock>(_ios);
_acceptor.async_accept(*socket, std::bind(&server::handle_accept,
this, socket, std::placeholders::_1));
}
void handle_accept(std::shared_ptr<sock> socket, const boost::system::error_code& ec)
{
auto connection = std::make_shared<CCon>();
if (connection->Accept(socket))
{
std::cout << "Connection accepted" << std::endl;
}
else
{
std::cout << "Connection not accepted" << std::endl;
}
do_accept();
}
boost::asio::io_service _ios;
boost::asio::ip::tcp::acceptor _acceptor;
std::set<std::shared_ptr<CCon>> _connections;
};
int32_t main(int32_t argc, char *argv[])
{
server s;
s.run();
}
连接 - >接受(插座)解释
bool CCon::Accept(<std::shared_ptr<sock>> tcpSocket)
{
// set handshake sequence
SendGreeting();
// I NEED TO WAIT HERE UNTIL connectionAccepted gets a value
if (connectionAccepted)
{
// Connection Accepted
return(true)
}
else
{
//Connection Rejected
return(false)
}
}
SendGreeting()包含
boost::asio::async_write(*tcpSocket,
boost::asio::buffer(oBuff,bytesBuffered),
std::bind(&CCon::WaitForResp,
this, std::placeholders::_1));
问题是WaitForResp永远不会被调用。如果在设置新的处理程序后重新启动io_service
(stop()
- >reset()
- >run()
),它只会被调用,这根本不是解决方案。
我想我错过了关于阿西奥的一些事情,如果有人能帮助我,我会很高兴。
我需要使用异步函数,因为我需要一个握手计时器,但我还需要等待(阻止)我的代码的一部分,以完成握手或计时器结束。 – Bituki
我试过使用期货,但不知何故,握手卡在第一个处理程序,直到'未来'完成其等待时间,然后所有的握手运行(也许我需要有io_service运行在另一个线程?)。我需要一些时间来简化我的代码并将其发布到此处,但我会尽力说清楚。 – Bituki
@TechnikEmpire我添加了一些代码。我希望现在更清楚。 – Bituki