2011-09-13 34 views
1

我在通过asyc_read()填充的streambuf中读取时遇到了一些问题。当通过我在VS单步调试代码,我可以看到正确的数据在缓冲,但是当我去阅读它:用istream从boost basic_streambuf中读取问题

std::istream is = std::istream(&buffer_); 

unsigned short type; 
unsigned short size; 

is >> type; 
is >> size; 

的类型和大小的变量保持在他们的初始化值。没有错误或任何东西被抛出。我真的难倒,为什么这是我见过类似的代码的情况下,其关闭数据读入的完全相同的方式变量

编辑: 所以这里是我的async_read代码,然后调用上面的代码:

boost::asio::async_read(socket_, 
    buffer_, 
    boost::asio::transfer_at_least(4), 
    boost::bind(&Session::handleReadBody, this, 
    boost::asio::placeholders::error, 
    boost::asio::placeholders::bytes_transferred)); 
+0

你好,迪。欢迎来到堆栈溢出!你能否发布一个简短的完整程序来证明你遇到的问题? –

回答

2

如果type保持其初始化值,很明显is >> type;失败:检查流的状态(if(is) {...})以确保。

而且,看到你有transfer_at_least(4),我怀疑你是在传输二进制数据,而不是空格分隔的ASCII字符串。如果是这样的话,使用read()

int16_t type, size; 
data.read(reinterpret_cast<char*>(&type), sizeof type); 
data.read(reinterpret_cast<char*>(&size), sizeof size); 

但要注意字节顺序。

+0

感谢,似乎解决它。我应该明确表示,我正在传输二进制数据,我不知道它有什么真正的区别,我对网络编程非常陌生。 idk是否有更简单的方法从流缓冲区中获取数据,而不仅仅是将其包装在istream中 – dee

+0

@dee它对于从流中读取有所不同('operator >>'是用于空格分隔的ASCII数据, read()'是二进制的)。从asio缓冲区读取更直接的信息可以用'reinrepret_cast (boost :: asio :: buffer_cast (buffer.data()))' – Cubbi