111-UDP 数据报被截断
有时候我们有这样的需求,在 udp 数据报传输的过程中,如果对方发过来的数据报很大,而我们的接收缓冲区不足以容纳这么大的数据报,怎么办?此时 udp 数据报就会被截断,有没有一种办法能判断数据报是否被截断呢?
先来看看 UDP 数据报被截断的行为,可能有下面三种:
丢弃超出部分,并向上层返回 MSG_TRUNC 标志。需要使用 recvmsg 来接收这个标志。直接丢弃,不通知保留超出部分,并在下一次读取中返回
POSIX 采用第一种办法。早期的 SVR4 采用第三种办法。
2. 解决方案约定:如果接收的数据长度恰好等于缓冲区大小,就主观认为被截断,这种方法不精确,但是具有跨平台性使用 recvmsg,接收标志位在后面的实验中,使用第二种方案。
3. 伪代码
本文程序路径:unp/program/advcudp/trunc
struct msghdr msg;4. 实验启动 udp 服务器启动 udp 客户端
// 填充 msg
recvmsg(sockfd, &msg, 0);
if (msg.msg_flags & MSG_TRUNC) {
// 信息被截断
由于接收方(服务器)缓冲区大小只有 20 字节,当收到的数据大小超过 20 字节时,数据报被截断,并返回 MSG_TRUNC 标志。
图1 数据报被截断
recvmsg 除了可以返回 MSG_TRUNC 标志位以外,还可以返回:
MSG_CTRUNC: 判断控制信息是否被截断MSG_BCAST: 判断数据报是否是广播MSG_MCAST: 判断数据报是否是多播…更多请参考 man 2 recvmsg
版权声明
本文仅代表作者观点,不代表博信信息网立场。
上一篇:[前端算法]关于整理思路的一点启发 下一篇:React中详解redux