دفعة :: آسيو: كيف يمكنني استخدام ASYNC_ACCEPT لقبول الاتصالات الواردة؟

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

سؤال

أنا أستخدم دفعة :: 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);
    }
}

يعمل هذا الرمز، ولكن أود التبديل إلى استخدام مقبولين :: ASYNC_ACCREPP بحيث يمكنني الاتصال بالمقبول :: إلغاء لإيقاف طلب الطلبات.

لذلك يبدو رمزي الجديد مثل هذا:

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