Async_Read 函数的问题
Problems with Async_Read function
简介
我正在研究c++
和boost/asio
实现分布式系统,所以我需要创建一个异步tcp服务器。
服务器像回声服务器一样工作,但您需要先发出请求(例如,通过套接字发送文本),服务器只响应 pi 号。
TCP 连接 class 用于主服务器 class
class tcp_connection
: public boost::enable_shared_from_this <tcp_connection> {
public:
typedef boost::shared_ptr<tcp_connection> pointer;
static pointer create(boost::asio::io_service &io_service){
return pointer(new tcp_connection(io_service));
}
tcp::socket &socket(){
return socket_;
}
void start(){
for(;;){
boost::asio::async_read(socket_, boost::asio::buffer(buffer_),
boost::bind(&tcp_connection::handle_read, shared_from_this(),
boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)
);
buffer_ = "Pi: 3.1415\n[=11=]";
boost::asio::async_write(socket_, boost::asio::buffer(buffer_),
boost::bind(&tcp_connection::handle_write, shared_from_this(),
boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
}
private:
tcp_connection(boost::asio::io_service &io_service)
: socket_(io_service){
}
void handle_write(const boost::system::error_code& /*error*/,
size_t /*bytes_transferred*/){
}
void handle_read(){
}
//attr
tcp::socket socket_;
std::string buffer_;
};
问题
我在 Whosebug 中阅读了一些教程和许多问题。我不明白为什么我有这个错误:error: ‘void (tcp_connection::*)()’ is not a class, struct, or union type
。
我在这一行找到错误源:boost::asio::async_read(...)
。如果我删除该行,服务器工作正常,但我需要了解 async_read
功能以便稍后实现复杂系统。
您的 async_read
需要一个处理程序 - 一个在从套接字读取内容时将被调用的函数。这个处理程序应该有一个特定的签名。在您的情况下,它应该类似于
void handle_read(boost::system::error_code const& ec, size_t bytes_transferred)
只是因为你把它当作
boost::bind(&tcp_connection::handle_read, shared_from_this(),
boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)
因此您将 tcp_connection::handle_read
与 this
(某种)(任何非静态方法的第一个隐式参数)以及错误代码和传输的字节数绑定,因此预期的签名是 void handle_read(boost::system::error_code const& ec, size_t bytes_transferred)
。也许您需要进一步了解 binding
的工作原理:http://www.boost.org/doc/libs/1_58_0/libs/bind/doc/html/bind.html
作为奖励:
你的
for (;;)
{
//read
// write
}
是同步方式。如果你想使用异步,你需要一些不同的东西。主要思想是将它们链接起来,以便您的读取采用处理程序,处理程序异步写入响应采用写入处理程序,写入处理程序启动另一个异步读取,如此循环。
简介
我正在研究c++
和boost/asio
实现分布式系统,所以我需要创建一个异步tcp服务器。
服务器像回声服务器一样工作,但您需要先发出请求(例如,通过套接字发送文本),服务器只响应 pi 号。
TCP 连接 class 用于主服务器 class
class tcp_connection
: public boost::enable_shared_from_this <tcp_connection> {
public:
typedef boost::shared_ptr<tcp_connection> pointer;
static pointer create(boost::asio::io_service &io_service){
return pointer(new tcp_connection(io_service));
}
tcp::socket &socket(){
return socket_;
}
void start(){
for(;;){
boost::asio::async_read(socket_, boost::asio::buffer(buffer_),
boost::bind(&tcp_connection::handle_read, shared_from_this(),
boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)
);
buffer_ = "Pi: 3.1415\n[=11=]";
boost::asio::async_write(socket_, boost::asio::buffer(buffer_),
boost::bind(&tcp_connection::handle_write, shared_from_this(),
boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
}
private:
tcp_connection(boost::asio::io_service &io_service)
: socket_(io_service){
}
void handle_write(const boost::system::error_code& /*error*/,
size_t /*bytes_transferred*/){
}
void handle_read(){
}
//attr
tcp::socket socket_;
std::string buffer_;
};
问题
我在 Whosebug 中阅读了一些教程和许多问题。我不明白为什么我有这个错误:error: ‘void (tcp_connection::*)()’ is not a class, struct, or union type
。
我在这一行找到错误源:boost::asio::async_read(...)
。如果我删除该行,服务器工作正常,但我需要了解 async_read
功能以便稍后实现复杂系统。
您的 async_read
需要一个处理程序 - 一个在从套接字读取内容时将被调用的函数。这个处理程序应该有一个特定的签名。在您的情况下,它应该类似于
void handle_read(boost::system::error_code const& ec, size_t bytes_transferred)
只是因为你把它当作
boost::bind(&tcp_connection::handle_read, shared_from_this(),
boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)
因此您将 tcp_connection::handle_read
与 this
(某种)(任何非静态方法的第一个隐式参数)以及错误代码和传输的字节数绑定,因此预期的签名是 void handle_read(boost::system::error_code const& ec, size_t bytes_transferred)
。也许您需要进一步了解 binding
的工作原理:http://www.boost.org/doc/libs/1_58_0/libs/bind/doc/html/bind.html
作为奖励:
你的
for (;;)
{
//read
// write
}
是同步方式。如果你想使用异步,你需要一些不同的东西。主要思想是将它们链接起来,以便您的读取采用处理程序,处理程序异步写入响应采用写入处理程序,写入处理程序启动另一个异步读取,如此循环。