Old*_*bie 1 c++ boost boost-asio
几年前,我使用Boost asio库编写了一个电子邮件客户端。
有一个带有四个子类的抽象类ICON。
POP3conN 到平面POP3通信
POP3conS 可确保POP3通信的安全
SMTPconN 到平面SMTP通信
SMTPconS 保护SMTP通信安全
ICON有一个会员
boost::asio::ip::tcp::socket socket_
Run Code Online (Sandbox Code Playgroud)
和两个虚拟过程,在echa子类中定义:
void SMTPconN::run() { socket_.get_io_service().run(); }
void SMTPconN::reset() { socket_.get_io_service().reset(); }
Run Code Online (Sandbox Code Playgroud)
该应用程序在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".
Run Code Online (Sandbox Code Playgroud)
因为我想对大量的代码和复杂的逻辑进行最小的更改:此遗漏方法是否有解决方法?
docs 指出您可以使用Networking TS兼容性,get_context().context()它将为您提供一个io_context实例(已io_service在boost 1.64 / 1.65 IIRC附近替换了一个实例)。
网络TS兼容性
Boost.Asio现在提供“网络的C ++扩展”技术规范指定的接口和功能。除了通过普通的Boost.Asio头文件进行访问之外,还可以通过与TS中定义的头文件相对应的特殊头来访问此功能。这些在下表中列出:
[...]
使用get_executor()。context()获得关联的io_context。
两者get_io_service()和get_io_context()以前都在方便移植的地方,但与此同时,它们也已被弃用和废弃。
PS:另请参见从boost :: asio :: ip :: tcp :: socket获取boost :: asio :: io_context以执行自定义功能,该功能与您的问题极为相似,但指定了特定的用例。
那里的评论针对该用例具有绝对更好的解决方案:
socket.get_io_service().post([](){ /* my custom code */ } );
Run Code Online (Sandbox Code Playgroud)
成为
post(socket.executor(), [](){ /* my custom code */ } );
Run Code Online (Sandbox Code Playgroud)