Boost-Asio, многопоточный tcp сервер - PullRequest
0 голосов
/ 28 января 2011

Я не могу преуспеть в многопоточной программе boost-asio.

Поскольку нет хорошего примера или документации по этому поводу, я хочу вашей помощи:)

Просто ядумаю, что этот код действительно прослушивает, но когда я хочу «буферизовать» данные буфера, он ничего не печатает и не прослушивает один раз и останавливается.

Мой код:

void Worker::startThread(int clientNumber) {
     cout << "listening: "<< clients[clientNumber]->port << endl;
     boost::asio::io_service io_service;
     tcp::acceptor acc(io_service, tcp::endpoint(tcp::v4(),portNumber[clientNumber]));
     socket_ptr sock(new tcp::socket(io_service));
     acc.accept(*sock);
     try
     {
     for (;;) {
        char data[max_length];
        boost::system::error_code error;
         cout << "message?" << endl;
        size_t length = sock->read_some(boost::asio::buffer(data), error);
         cout << "message :)" << endl;
        cout << data << endl;
        if(error == boost::asio::error::eof)
            break; // Connection closed cleanly by peer.
        else if (error)
            throw boost::system::system_error(error); // Some other error.

     }
     }
     catch (std::exception& e)
     {
         std::cerr << "Exception in thread: " << e.what() << "\n";
     }
}
void Worker::start() {
     cout << "Starting thread server" << endl;
     for(int i=0; i<clients.size(); i++) {
         boost::thread t(boost::bind(&Worker::startThread, this, i));
     }

     for(;;);
}

Ответы [ 2 ]

5 голосов
/ 28 января 2011

Вы не очень долго просматривали документацию, если не видите многопоточных примеров

HTTP-сервер 3

HTTP-сервер, использующий один io_service и вызов пула потоков io_service :: Run ().


HTTP-сервер 2

HTTP-сервер, использующий Дизайн io_service-per-CPU.

Имейте в виду, что в этих примерах используются асинхронные методы, в которых библиотека Boost.Asio действительно сияет.

4 голосов
/ 28 января 2011

Вы в основном скопировали пример Blocking TCP Echo Server , но не можете найти хороший пример или документацию?

В любом случае, я вижу некоторые проблемы с вашим кодом:

  • Вы говорите, что слушаете на clients[clientNumber]->port, но фактический порт, на котором вы слушаете, - portNumber[clientNumber];
  • Вам необходимо обнулить ваш data после read_some и перед его печатью;
  • Как только условие error == boost::asio::error::eof выполнено (клиент отключен), поток завершится, и поэтому вы не сможете (повторно) подключить другого клиента к этому порту;
  • Вы принимаете только первое соединение / клиент, любые другие клиенты, подключающиеся к тому же порту, не будут обрабатывать свои сообщения каким-либо образом.
...