повышение ::asio:Как мне использовать async_accept для приема входящих подключений?
-
23-08-2019 - |
Вопрос
Я использую boost:: asio, и у меня есть такой код:
void CServer::Start(int port)
{
tcp::acceptor acceptor(m_IoService, tcp::endpoint(tcp::v4(), port));
for ( ;; )
{
shared_ptr<tcp::socket> pSocket(new tcp::socket(m_IoService));
acceptor.accept(*pSocket);
HandleRequest(pSocket);
}
}
Этот код работает, но я хотел бы переключиться на использование Acceptor::async_accept, чтобы я мог вызвать Acceptor::cancel, чтобы прекратить прием запросов.
Итак, мой новый код выглядит следующим образом:
void CServer::StartAsync(int port)
{
m_pAcceptor = shared_ptr<tcp::acceptor>( new tcp::acceptor(m_IoService, tcp::endpoint(tcp::v4(), port)) );
StartAccept();
}
void CServer::StopAsync()
{
m_pAcceptor->cancel();
}
void CServer::StartAccept()
{
shared_ptr<tcp::socket> pSocket(new tcp::socket(m_IoService));
m_pAcceptor->async_accept(*pSocket, bind(&CServer::HandleAccept, this, pSocket));
}
void CServer::HandleAccept(shared_ptr<tcp::socket> pSocket)
{
HandleRequest(pSocket);
StartAccept();
}
Но этот код, похоже, не работает, моя функция CServer::HandleAccept никогда не вызывается.Есть какие-нибудь идеи?Я просмотрел пример кода, и основное различие между моим кодом и их заключается в том, что они, похоже, часто создают класс типа tcp_connection, который имеет сокет в качестве члена, и я не понимаю, зачем это нужно.
- Алекс
Решение
Ах, похоже, чтобы начать работу, вам нужно запустить IOService, например:
m_IoService.run();
Не связан с StackOverflow