2010-11-01 3 views
0

Je fais un serveur avec le BoostLib, et j'utilise donc la librairie asio.Boost :: Asio Threaded Server Asynchroun Problème. Rien ne se passe

J'ai créé une classe Serveur.

Server::Server(unsigned short port) 
: m_IOService(), 
    m_Socket(m_IOService), 
    m_Endpoint(boost::asio::ip::tcp::v4(), port), 
    m_Acceptor(m_IOService) 
{ 
m_Port = port; 

m_Acceptor.open(m_Endpoint.protocol()); 
m_Acceptor.bind(m_Endpoint); 
} 

Et la fonction Début:

void Server::Run() 
{ 
// Threading 
////////////////////////////////////////////////////// 
    std::vector<boost::shared_ptr<boost::thread> > threads; 
    for (std::size_t i = 0; i < THREAD_POOL_SIZE; ++i) 
    { 
    boost::shared_ptr<boost::thread> thread(new boost::thread(
    boost::bind(&boost::asio::io_service::run, &m_IOService))); 
    threads.push_back(thread); 
    } 

    // Wait for all threads in the pool to exit. 
    for (std::size_t i = 0; i < threads.size(); ++i) 
    threads[i]->join(); 



// Begin Client accepting 
////////////////////////////////////////////////////// 

m_Acceptor.listen(); 
m_Acceptor.async_accept(
    m_FreeClient->GetSocket(), 
    boost::bind(&Server::OnConnection, this, boost::asio::placeholders::error)); 
} 

m_FreeClient est un pointeur sur la classe client.

GetSocket Defination: `boost::asio::ip::tcp::socket& GetSocket();´ 

Je compilé & commencé ce code, et connecté avec un peu TestClient. La connexion est là, mais Server :: OnConnection ne sera jamais appelé. J'ai débogué, et mis un point d'arrêt, mais il ne casse jamais là.

Alors qu'est-ce qui ne va pas? THREAD_POOL_SIZE est 25.

Répondre

3

Peut-être que ce code n'est pas la version complète mais vous ne savez pas pourquoi vous attendez que tous vos threads se terminent (en utilisant join) avant d'ouvrir le socket. Je pense que vous devez déplacer ceci:

// Wait for all threads in the pool to exit. 
    for (std::size_t i = 0; i < threads.size(); ++i) 
    threads[i]->join(); 

être la dernière chose que vous faites avant la sortie de processus, ou tout au moins après:

// Begin Client accepting 
////////////////////////////////////////////////////// 

m_Acceptor.listen(); 
m_Acceptor.async_accept(
    m_FreeClient->GetSocket(), 
    boost::bind(&Server::OnConnection, this, boost::asio::placeholders::error)); 

Sinon, votre piscine de fil sera jamais un travail à faire.

+0

Merci beaucoup, mon problème est maintenant résolu :) – Aurus

0

Vous devriez obtenir la version à un seul thread avant de sauter dans plusieurs threads. À première vue, il semble que vous deviez appeler ip::tcp::acceptor::listen() et ip::tcp::acceptor::async_accept() avant d'appeler io_service::run().