从this example开始,我想用async_read_until()
替换async_read()
。boost ASIO async_read_until不能用ASIO ssl客户端编译示例
所以我抬头看了this example,看到async_read_until()
被调用。我看到它被称为如下:
boost::asio::async_read_until(socket_, response_, "\r\n",
boost::bind(&client::handle_read_status_line, this,
boost::asio::placeholders::error));
因此,我认为相比于SSL客户端的例子,唯一的区别是,response_
是boost::asio::streambuf
。所以,我创建了一个对象在我的类主体以同样的方式,然后在SSL客户端的例子,我代替回调函数:
boost::asio::async_read(socket_,
boost::asio::buffer(reply_, bytes_transferred),
boost::bind(&SSLClient::handle_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
与其他功能,并删除了bytes_transferred
部分。它变成:
boost::asio::async_read_until(socket_, response_, "\r\n",
boost::bind(&SSLClient::handle_read, this,
boost::asio::placeholders::error));
但是...这不会编译。它给了我这些错误:
In file included from /usr/include/boost/bind.hpp:22:0,
from SSLClient.h:5,
from main.cpp:14:
/usr/include/boost/bind/bind.hpp: In instantiation of 'struct boost::_bi::result_traits<boost::_bi::unspecified, void (SSLClient::*)(const boost::system::error_code&, long unsigned int)>':
/usr/include/boost/bind/bind_template.hpp:15:48: required from 'class boost::_bi::bind_t<boost::_bi::unspecified, void (SSLClient::*)(const boost::system::error_code&, long unsigned int), boost::_bi::list2<boost::_bi::value<SSLClient*>, boost::arg<1> (*)()> >'
SSLClient.h:99:51: required from here
/usr/include/boost/bind/bind.hpp:69:37: error: 'void (SSLClient::*)(const boost::system::error_code&, long unsigned int)' is not a class, struct, or union type
typedef typename F::result_type type;
^
In file included from main.cpp:14:0:
SSLClient.h:87:70: warning: unused parameter 'bytes_transferred' [-Wunused-parameter]
void handle_write(const boost::system::error_code& error, size_t bytes_transferred)
^
In file included from /usr/include/boost/asio/impl/io_service.hpp:18:0,
from /usr/include/boost/asio/io_service.hpp:767,
from /usr/include/boost/asio/basic_io_object.hpp:19,
from /usr/include/boost/asio/basic_socket.hpp:20,
from /usr/include/boost/asio/basic_datagram_socket.hpp:20,
from /usr/include/boost/asio.hpp:21,
from SSLClient.h:6,
from main.cpp:14:
/usr/include/boost/asio/impl/read_until.hpp: In instantiation of 'typename boost::asio::async_result<typename boost::asio::handler_type<WriteHandler, void(boost::system::error_code, long unsigned int)>::type>::type boost::asio::async_read_until(AsyncReadStream&, boost::asio::basic_streambuf<Allocator>&, const string&, ReadHandler&&) [with AsyncReadStream = boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >; Allocator = std::allocator<char>; ReadHandler = boost::_bi::bind_t<boost::_bi::unspecified, void (SSLClient::*)(const boost::system::error_code&, long unsigned int), boost::_bi::list2<boost::_bi::value<SSLClient*>, boost::arg<1> (*)()> >; typename boost::asio::async_result<typename boost::asio::handler_type<WriteHandler, void(boost::system::error_code, long unsigned int)>::type>::type = void; std::string = std::basic_string<char>]':
SSLClient.h:99:52: required from here
/usr/include/boost/asio/impl/read_until.hpp:707:3: error: static assertion failed: ReadHandler type requirements not met
BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
^
/usr/include/boost/asio/impl/write.hpp:615:3: error: no match for call to '(boost::_bi::bind_t<boost::_bi::unspecified, void (SSLClient::*)(const boost::system::error_code&, long unsigned int), boost::_bi::list2<boost::_bi::value<SSLClient*>, boost::arg<1> (*)()> >) (const boost::system::error_code&, const long unsigned int&)'
BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
^
Makefile:472: recipe for target 'main.o' failed
make: *** [main.o] Error 1
13:14:05: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project GNOMEClientCmd (kit: Qt 5.4.1)
When executing step "Make"
13:14:05: Elapsed time: 00:04.
我不得不这样做,以获得所有这些错误,也同样说明切换从async_read
到async_read_until
。如果我回到async_read
,它编译得很好。我究竟做错了什么?
如果您需要任何其他信息,请询问。谢谢。
其实你让我注意到我忘记了在回调函数中删除'bytes_transferred'占位符。我删除它并编译。老实说,这是回调函数中最糟糕的事情。他们的调试是一场噩梦,非常不明确。没有清楚的迹象表明问题是什么,只能猜测和想象......我希望有更好的方法来调试回调函数。谢谢。 –
好吧。说实话,我不配你咆哮。如果你有一个有能力的编译器,只需使用lambdas。这里甚至没有Asio栈(它确实有回调概念断言),它只是绑定barfing。你不需要绑定一个lambda。 _帮助你的编译器帮助你_ – sehe
对不起,朋友,这不是一个咆哮。我非常感谢你的帮助。我只是在抱怨它是多么烦人,因为这是一个微不足道的问题,我不能注意到它,因为来自编译器的巨大报告是与实际问题相距甚远的错误。这与你无关:-)感谢lambdas的建议,我会考虑它的。 –