używam boost :: asio i mam kod jak poniżej:boost :: asio: Jak używać async_accept do akceptowania połączeń przychodzących?
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);
}
}
Ten kod działa, ale chciałbym, aby przełączyć się na używanie akceptora :: async_accept tak, że mogę zadzwonić Akceptanta :: anuluj, aby przestać odbierać żądania.
Więc mój nowy kod wygląda następująco:
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();
}
Ale ten kod nie wydają się działać, moja funkcja CServer :: HandleAccept nigdy nie jest wywoływana. Jakieś pomysły? Przyjrzałem się przykładowemu kodowi, a główną różnicą między moim kodem a ich jest to, że wydają się często tworzyć klasę jak tcp_connection, która ma gniazdo jako członek, i nie widzę powodu, dla którego jest to konieczne.
- Alex