我正在使用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