【问题标题】:Get number of bytes read by boost::asio::async_read获取 boost::asio::async_read 读取的字节数
【发布时间】:2011-05-20 21:19:31
【问题描述】:

我正在尝试将函数 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

我怎样才能完成我想做的事情?另外,这些错误是什么意思,我该如何解决?

【问题讨论】:

  • @Kiril Kirov 我也不知道当我双击这个错误时它会出现在这里 bind.hpp template&lt;class F&gt; struct result_traits&lt;unspecified, F&gt; { typedef typename F::result_type type; }; 但我没有使用 F idk 有什么问题!!?
  • 对不起,我几乎立即删除了我的评论,因为我错过了一些东西。抱歉,帮不了你,很遗憾,我从未使用过 boost。

标签: c++ sockets visual-c++ boost boost-asio


【解决方案1】:

async_read 不返回读取的字节数。它在后台异步执行读取。字节数被传递给完成处理程序。当读取完成时,ASIO 会调用完成处理程序。您将完成处理程序传递给async_readasync_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 示例以获得更好的开发示例。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2013-12-21
  • 1970-01-01
相关资源
最近更新 更多