提升asio读取动态大小的消息

时间:2015-03-04 22:13:04

标签: c++ boost boost-asio

如何使用boost asio从套接字正确接收N个字节。我假设前4个字节是我的消息的长度,所以我尝试了这样的事情:

            size_t len = 0;
            boost::asio::read(socket, boost::asio::buffer(&len, sizeof(size_t)));
            std::cout<<"READ SOMETHING: "<< len <<std::endl;
            boost::asio::read(socket, boost::asio::buffer(vec, len), boost::asio::transfer_exactly(len), error);
            std::cout<<"READ TO BUFFER END"<<std::endl;

我预计第二次读取调用将会阻塞,直到 len 字节将被接收,但我看起来不像那样工作。

我的输出看起来像(2x int32等于4):

 READ SOMETHING: 4
 READ TO BUFFER END
 READ SOMETHING: 4
 READ TO BUFFER END

我尝试发送一次8字节或2x 4字节,看起来效果不正常。

1 个答案:

答案 0 :(得分:0)

我怀疑vec可能太小。

documentation states(注意min(...)):

  

返回值

     

mutable_buffers_1等值于:

mutable_buffers_1(
    data.size() ? &data[0] : 0,
    min(data.size() * sizeof(PodType), max_size_in_bytes));

所以,如果你有

std::vector<char> vec(4);

并将其与

一起使用
boost::asio::read(socket, boost::asio::buffer(vec, len), boost::asio::transfer_exactly(len), error);

缓冲区实际上只有4个字节,而不是len。这与

相结合
  

boost::asio::read

template<
    typename SyncReadStream,
    typename MutableBufferSequence,
    typename CompletionCondition>
std::size_t read(
    SyncReadStream & s,
    const MutableBufferSequence & buffers,
    CompletionCondition completion_condition);
     

此函数用于从流中读取一定数量的字节数据。该调用将阻塞,直到满足下列条件之一:

     
      
  • 提供的缓冲区已满。也就是说,传输的字节数等于缓冲区大小的总和。
  •   
  • completion_condition函数对象返回0.
  •   

由于第一个结束条件,它将提前返回