我的目标是分两步从 UDP 套接字读取数据。问题是,如果我向套接字写入的数据多于第一步读取的数据。结果是剩余的数据消失了。
我将代码简化为以下代码段:
#include <boost/asio/ip/udp.hpp>
using namespace boost::asio;
int main() {
io_service net_io;
ip::udp::socket net_sock( net_io, ip::udp::endpoint( ip::udp::v4(), 1234 ) );
uint8_t data[2];
net_sock.receive( buffer( data, 2 ) );
std::cout << data[0] << data[1] << std::endl;
net_sock.receive( buffer( data, 2 ) );
std::cout << data[0] << data[1] << std::endl;
net_sock.close();
return EXIT_SUCCESS;
}
当我将数据写入套接字时,如下所示:
echo '0123456789' | nc -u localhost 1234
程序输出前两个字节01
,然后阻塞。相反,我期望输出:
01
23
但是,它在第二次receive()
调用时阻塞。根据
手册:
调用将阻塞,直到以下条件之一为真:
∙ 提供的缓冲区已满。[…]
∙ 发生错误。
为什么缓冲区是空的?如果我启动
echo '0123456789' | nc -u localhost 1234
第二次,receive()
呼叫解除阻塞,但也输出01
。我第一次输入的剩余数据23456789
去了哪里,如何在后续
receive()
调用中访问它?
一些背景:用例是读取可变长度的数据包,这意味着首先读取标头,然后在标头处理后(包括有关数据包长度的信息)继续读取有效负载。