几年前,我使用Boost asio库编写了一个电子邮件客户端。
有一个带有三个子类的虚拟类 ICON 。
POP3conN 到平面POP3通信
POP3conS 以保护POP3通信
SMTPconN 到平面SMTP通信
SMTPconS 以保护SMTP通信
图标有一个成员
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".
因为我想对大量的代码和复杂的逻辑进行最小的更改:这种遗漏的方法是否有解决方法?
答案 0 :(得分:4)
文档在Networking TS compatibility下声明您可以使用get_context().context()
,这将为您提供一个io_context
实例(它在增强IIRC 1.64 / 1.65 IIRC附近替换了io_service
)。
网络TS兼容性
Boost.Asio现在提供“网络的C ++扩展”技术规范指定的接口和功能。除了通过常规的Boost.Asio头文件进行访问之外,还可以通过与TS中定义的头文件相对应的特殊头来访问此功能。这些在下表中列出:
[...]
使用get_executor()。context()获得关联的io_context。
get_io_service()
和get_io_context()
以前都是为了方便移植而设计的,但与此同时,它们也已被弃用和废弃。
PS:另请参见Get boost::asio::io_context from a boost::asio::ip::tcp::socket to exec a custom function,与您的问题极为相似,但指定了特定的用例。
该评论针对该用例具有 确定更好的解决方案 :
socket.get_io_service().post([](){ /* my custom code */ } );
成为
post(socket.executor(), [](){ /* my custom code */ } );
答案 1 :(得分:0)
子类: 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_;
wich在构造函数中初始化,替换了对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
取代。