2009-07-06 18 views
5

मैं बढ़ावा :: asio उपयोग कर रहा हूँ, और मैं इस तरह कोड है:boost :: asio: आने वाले कनेक्शन को स्वीकार करने के लिए मैं async_accept का उपयोग कैसे करूं?

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_accept उपयोग पर स्विच करना ताकि मैं स्वीकारकर्ता कॉल कर सकते हैं करना चाहते हैं :: अनुरोध प्राप्त करना बंद करने के लिए रद्द करें।

तो मेरी नई कोड इस तरह दिखता है:

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 कहा जाता हो जाता है कभी नहीं। कोई विचार? मैंने नमूना कोड देखा है, और मेरे कोड और उनके बीच मुख्य अंतर यह है कि वे अक्सर टीसीपी_कनेक्शन जैसी कक्षा बनाते हैं जिसमें सदस्य के रूप में सॉकेट होता है, और मैं यह नहीं देख रहा हूं कि यह आवश्यक क्यों है।

  • एलेक्स

उत्तर

11

आह, बातें शुरू करने के लिए की तरह लग रहा तुम, IOService चलाने की आवश्यकता उदा .:

m_IoService.run(); 
संबंधित मुद्दे