повышение ::asio:Как мне использовать async_accept для приема входящих подключений?

StackOverflow https://stackoverflow.com/questions/1087199

Вопрос

Я использую 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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top