Альтернатива отсутствующему методу в последней версии библиотеки Boost Asio - PullRequest
1 голос
/ 20 мая 2019

Несколько лет назад я написал почтовый клиент, использующий библиотеку Boost asio.

Существует абстрактный класс ICON с четырьмя подклассами.

POP3conN для плоской связи POP3

POP3conS для защиты связи POP3

SMTPconN для плоской связи SMTP

SMTPconS для защиты SMTP-связи

ICON имеет члена

boost::asio::ip::tcp::socket socket_

и две виртуальные процедуры, определенные в подклассе echa:

void SMTPconN::run() { socket_.get_io_service().run(); }
void SMTPconN::reset() { socket_.get_io_service().reset(); }

Приложение работало нормально с boost_1_63_0. Но когда я пытаюсь обновить до boost_1_70_0, компилятор (MS V Studio 2015) жалуется в обоих определениях:

class "boost::asio::ssl::stream<boost::asio::ip::tcp::socket>" has no member "get_io_service".

Поскольку я хочу внести минимальное изменение в огромный код и сложную логику: есть ли обходной путь для этого пропущенного метода?

Ответы [ 2 ]

6 голосов
/ 20 мая 2019

Состояние документов при Совместимость с сетевым TS , которое вы можете использовать get_context().context(), что даст вам io_context экземпляр (который заменил io_service где-то в районе повышения 1.64 / 1.65 IIRC).

Совместимость с TS по сети

Boost.Asio теперь предоставляет интерфейсы и функциональные возможности, указанные в технической спецификации «Расширения C ++ для работы в сети».В дополнение к доступу через обычные заголовочные файлы Boost.Asio, эта функциональность может быть доступна через специальные заголовки, которые соответствуют заголовочным файлам, определенным в TS.Они перечислены в таблице ниже:

[...]

Используйте get_executor (). Context () для получения связанного io_context.

Оба get_io_service() и get_io_context() ранее были на месте для облегчения портирования, но в то же время они также устарели и устарели.

PS: см. Также Get boost :: asio :: io_context отboost :: asio :: ip :: tcp :: socket для выполнения пользовательской функции , которая очень похожа на ваш вопрос, но указывает конкретный вариант использования.

Комментарии там имеют явно лучшее решение для этого варианта использования:

socket.get_io_service().post([](){ /* my custom code */ } );

Становится

post(socket.executor(), [](){ /* my custom code */ } );
0 голосов
/ 11 июня 2019

Подклассы: POP3conN и SMTPconN имеют члена:

boost::asio::ip::tcp::socket socket_

Аналогично, POP3conS и SMTPconS имеют члена:

boost::asio::ssl::stream<boost::asio::ip::tcp::socket>  socket_;

Первым аргументом всех конструкторов является указатель на io_service. Некоторые как:

IPCON::IPCON(boost::asio::io_service* ioserv_, ...) { ... }

POP3conN::POP3conN(boost::asio::io_service* ioserv_, ....) {...}

Первое изменение : в абстрактный класс IPCON добавлен новый член:

boost::asio::io_context* iocontPtr_;

который инициализируется в конструкторе, заменяя старую ссылку на io_service:

IPCON::IPCON(boost::asio::io_context* iocont_, ...) { ... }

В конструкторы подклассов была добавлена ​​инициализация для такого члена:

POP3conN::POP3conN(boost::asio::io_context* iocont, ....) : IPCON(iocont) { ... }

Второе изменение : все случаи

boost::asio::io_service

Может быть заменено на

boost::asio::io_context

Проблемные выражения

void SMTPconN::run() { socket_.get_io_service().run(); }
void SMTPconN::reset() { socket_.get_io_service().reset(); }

теперь выглядит так:

void SMTPconN::run() { iocontPtr->run(); }
void SMTPconN::reset() { iocontPtr->reset(); }

Кажется, что функциональность старого io_service была заменена новым io_context.

...