Здравствуйте. Имеется следующий код из серверного плагина некоторой игры, взятый с инета исходником:
void Server::startAsync() { unsigned short port = acceptor->local_endpoint( ).port( ); logprintf( "*** Plugin: Started TCP server on port %d", port); io_service.reset( ); boost::system::error_code error; io_service.run( error); logprintf( "*** Plugin: Stopped TCP server on port %d", port); }
В консоли должно писать только ".. Started ..", но пишет и это, и ".. Stopped ..". Спрашивал на других форумах - говорят что в io_service нет задач, поэтому он завершается. Выводил error в консоль, там пишет число "6". Помогите разобраться здесь, в чем проблема? Уже много своих вещей сделал в этом проекте, а при проверке такая штука оказалась..
Vasiliy1301
Когда кончаются задачи - io_service::run() выходит.
Посмотри класс io_service::work.
Используется как раз для того, чтобы io_service::run() не выходил, когда нет задач.
Но судя по всему у тебя происходит какая-то ошибка, в этом случае run() тоже вылетает.
Читай официальную документацию или в самих исходниках посмотри что эта ошибка значит. Можешь использовать метод boost::system::error_code::message() чтобы посмотреть человеко-читаемое сообщение об ошибке.
Alexander K
Я вывел вот так:
boost::system::error_code error; io_service.run(error); logprintf( "ERROR: %s", error.message( ));
В консоли пишет "Неверный дескриптор". Вот скрин участка кода: http://imgdepo.com/id/i9986086. Пробовал менять еще местами эти строки:
{ session->StartAsync(); //2 startAccept( ); //1 }
но никаких изменений.
Сначала делаешь ресет сервису, потом добавляешь задачи, потом run
denesik
> Сначала делаешь ресет сервису, потом добавляешь задачи, потом run
reset не влияет на задачи, можно сначала повесить задачи, потом reset + run.
Vasiliy1301
У тебя ошибка где-то в другом месте, например в startAccept'е.
Alexander K
>
> reset не влияет на задачи, можно сначала повесить задачи, потом reset + run.
мб, но точно помню там было не очень логично с этим.. лучше без ресета сделать рабочий вариант, а потом его пришаманивать
denesik
волнует 1 вопрос, какие задачи выполняются им, и какой можно в этом случае поставить?
Попробовал сделать вот такое, на сайте нашел:
итог - краш сервера. Оставлял только первые 2 строки с io_service srv - так же.
Ну помогите же мне пожалуйста, ребят(
Vasiliy1301
Надо не ныть, что ничего не получается, и не копировать втупую код из интернетов, а взять, спокойно прочитать документацию (у буста нормальная документация), потом взять дебаггер, пройтись им по коду, поглядеть что и как работает, и вот только после этого станет понятно в чем проблема. Бездумное копирование никогда не приведет к хорошему результату.
В документации к бусту есть отличный пример, компилишь его и изучаешь как работает.
Валидная ссылка на текущий момент:
http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp11/chat/
denesik
спасибо) буду смотреть.
Тема в архиве.