如何使用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字节,看起来效果不正常。
答案 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.
由于第一个结束条件,它将提前返回