我正在尝试将函数boost::asio::async_read
的返回值转换为int
,以便查看我是否收到了任何数据:
int recvlen = boost::asio::async_read (
socket_,
boost::asio::buffer((char*)buffer, 1000),
boost::bind(&Connection::Receive, this, boost::asio::placeholders::error)
);
这是我的其余代码上下文中的语句,它不能编译:
.h文件:
#ifndef _CONNECTION_H_
#define _CONNECTION_H_
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio.hpp>
#include <stdint.h>
class Connection
{
public:
Connection(boost::asio::io_service& io_service);
~Connection();
boost::asio::ip::tcp::socket& socket() {return socket_;}
void Send(uint8_t* buffer, int length);
bool Receive();
protected:
virtual void OnReceived(uint8_t* buffer, int len) = 0;
private:
boost::asio::ip::tcp::socket socket_;
};
#endif
.cpp文件:
#include "Connection.h"
Connection::Connection(boost::asio::io_service& io_service)
: socket_(io_service) {}
Connection::~Connection() {}
void Connection::Send(uint8_t* buffer,int length) {
boost::asio::async_write (
socket_,
boost::asio::buffer(buffer, length),
boost::bind(&Connection::Send, this,boost::asio::placeholders::error)
);
}
bool Connection::Receive(){
uint8_t* buffer = new uint8_t[1000];
//Conversion excerpt
int recvlen = boost::asio::async_read (
socket_,
boost::asio::buffer((char*)buffer, 1000),
boost::bind(&Connection::Receive, this, boost::asio::placeholders::error)
);
if (recvlen <= 0) {
delete[] buffer;
return false;
}
this->OnReceived(buffer, recvlen);
delete[] buffer;
return true;
}
这些是此代码在Visual C ++中产生的错误:
error C2825: 'F': must be a class or namespace when followed by '::' e:\boost_1_46_1\boost_1_46_1\boost\bind\bind.hpp 69
error C2039: 'result_type' : is not a member of '`global namespace'' e:\boost_1_46_1\boost_1_46_1\boost\bind\bind.hpp 69
error C2146: syntax error : missing ';' before identifier 'type' e:\boost_1_46_1\boost_1_46_1\boost\bind\bind.hpp 69
error C2208: 'boost::_bi::type' : no members defined using this type e:\boost_1_46_1\boost_1_46_1\boost\bind\bind.hpp 69
error C1903: unable to recover from previous error(s); stopping compilation e:\boost_1_46_1\boost_1_46_1\boost\bind\bind.hpp 69
IntelliSense: a value of type "void" cannot be used to initialize an entity of type "int" d:\c++\ugs\common\connection.cpp 18
IntelliSense: the #endif for this directive is missing d:\c++\ugs\common\connection.h 1
IntelliSense: this declaration has no storage class or type specifier d:\c++\ugs\common\connection.h 26
我怎样才能完成我想要做的事情?另外,这些错误意味着什么,我该如何解决?
答案 0 :(得分:2)
async_read
不返回读取的字节数。它以异步方式在后台执行读取。字节数传递给完成处理程序。读取完成后,ASIO将调用完成处理程序。您将完成处理程序传递到async_read
。 async_read
是一个模板,它接受任何函数对象作为处理程序。在您的情况下,您传递了绑定语句的输出。
boost documentation中有很好的例子,但这里有两个快速解决方案。
您可以使用同步boost :: asio :: read函数而不是boost :: asio :: async_read。
int recvlen = boost::asio::read(socket_,boost::asio::buffer((char*)buffer, 1000));
或者,您可以添加新功能:
void HandleReceive(boost::system::error_code &error, std::size_t recvlen)
{
if (!error && error != boost::asio::error::message_length) {
this->OnReceived(buffer, recvlen);
delete [] buffer;
} // else ERROR!!!
}
并调用async_read,如
boost::asio::async_read(socket_,boost::asio::buffer((char*)buffer, 1000),
boost::bind(&Connection::HandleReceive, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
您必须使buffer
类变量才能使异步示例正常工作,但您可能想要一种更好的方法来管理内存。此外,您还必须采取措施来处理Connection
类的生命周期问题。查看ASIO示例以获得更好的示例。