2013-09-13 3 views
0

Я начинаю использовать Boost, так что, возможно, я что-то испортил.Boost HTTP server issue

Я пытаюсь настроить http-сервер с boost (ASIO). Я взял код из документов: http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/examples/cpp03_examples.html (HTTP-сервер, первый)

Единственное отличие от примера: я запускаю сервер своим методом «запускать» и запускать io_service в фоновом потоке, например, в Документы: http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/io_service.html

boost::asio::io_service::work work(io_service_); 

(. Кроме того, я останавливая io_service от моего метода запуска тоже)

Когда я начинаю это модифицированный сервер кажется, что все будет в порядке, запустите метод работает отлично. Но затем я пытаюсь получить документ с сервера, зависающий от запроса, и поток управления никогда не приходит к методу request_handle. Я что-то упустил?

UPD. Вот мой код запуска:

void NetstreamServer::run() 
{ 
    LOG4CPLUS_DEBUG(logger, "NetstreamServer is running"); 
    boost::asio::io_service::work work(io_service_); 
    try 
    { 
     while (true) 
     { 
     if (condition) 
     { 
      io_service_.stop(); 
      break; 
     } 
     } 
    } 
    catch (std::exception const& e) 
    { 
     LOG4CPLUS_ERROR(logger, "NetstreamServer" << " caught exception: " << e.what()); 
    } 
} 
+0

Где находится 'io_service_.run()'? –

+0

Может быть, я не понимаю документ (http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/io_service.html), но AFAIU, так как я создаю объект «work» Мне это не нужно. – Val

+2

Рабочий объект гарантирует, что 'io_service :: run' не будет завершен (цитирование из вашей ссылки: *" Это гарантирует, что функция run() объекта io_service не будет завершена, пока выполняется работа, и что она завершается, когда есть незавершенной работы не осталось. *). Но если вы не называете 'io_service :: run', никто не сделает это за вас. –

ответ

1

Вы должны позвонить io_service_::run() - в противном случае никто не отправит обработчиков завершения Asio объектов, обслуживаемых io_service_.

+0

Я получаю это, но у меня есть вопрос: предотвращает ли 'work' объект' io_service :: run' от блокировки? Или что мне нужно сделать, чтобы получить такое поведение? – Val

+0

@Val Нет, 'work' продлевает блокировку' run', потому что блоки 'run' пока работают. Если вам нужна неблокирующая перегрузка обработчика, используйте 'poll' (и вам не нужен объект' work'; http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/io_service .html). Я действительно рекомендую вам прочитать учебное пособие по Asio и прочитать его, * до * написания приложений. –

0

Не включая код, который вы изменили, все могут только гадать. К сожалению, вы также не включаете компилятор и используемую ОС. Даже если вы утверждаете, что он независим от платформы, вы всегда должны включать эту информацию, поскольку на самом деле платформы различаются даже с повышением.

Позвольте мне угадать. Вы используете Microsoft Windows? Как вы предотвращаете выход «основной» функции? Вы переместили блокирующую функцию «run» из нее в другой поток, у основной функции больше нет точки ожидания. Позвольте мне снова предположить, вы использовали что-то вроде «getchar». При этом вы можете выйти из своего сервера, только нажав клавишу возврата клавиатуры. Если да, то проблема заключается в том, что getchar, к сожалению, блокирует каждую реализацию asio socket, но только в системах на базе Windows.

Мне не нужно было догадываться, включите ли вы информацию, указанную в сообщении. В частности, все (!) Изменения вы внесли в образец кода.

+0

Благодарим за отзыв. Я использую linux (Mint 14 x64, если это имеет значение), и я обновил свой вопрос, добавив код метода run. Надеюсь, теперь это ясно. – Val