Boost :: Asio Сервер с резьбой Asynchroun Проблема. Ничего не случилось - PullRequest
0 голосов
/ 01 ноября 2010

Я делаю Сервер с BoostLib, и поэтому я использую asio lib.

Я создал класс Server.

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);
}

И функция запуска:

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 - указатель на класс клиента.

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

Я скомпилировал и запустил этот Кодекс и связал его с небольшим TestClient. Соединение есть, но Server :: OnConnection никогда не будет вызываться. Я отладил и установил точку останова, но она там никогда не ломается.

Так что не так. THREAD_POOL_SIZE - 25.

Ответы [ 2 ]

3 голосов
/ 01 ноября 2010

Возможно, этот код не является полной версией, но неясно, почему вы ожидаете выхода всех потоков (используя join), прежде чем открывать сокет.Я думаю, вам нужно переместить это:

   // 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));

В противном случае ваш пул потоков никогда не будетполучить любую работу.

0 голосов
/ 01 ноября 2010

Вы должны получить однопоточную версию, работающую до перехода в несколько потоков.На первый взгляд кажется, что вы должны вызывать ip::tcp::acceptor::listen() и ip::tcp::acceptor::async_accept() до вызова io_service::run().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...