六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 306|回复: 0

UDP数据包截断

[复制链接]

升级  33.33%

26

主题

26

主题

26

主题

秀才

Rank: 2

积分
100
 楼主| 发表于 2013-2-7 13:18:17 | 显示全部楼层 |阅读模式
Posix系列的recv、recvfrom、read函数均无法得到数据包被截断的错误消息,只有recvmsg可以得到该消息。

ssize_t recvmsg(int socket, struct msghdr *message, int flags);

如果message->msg_flags & MSG_TRUNC为真,则表示数据包被截断。超出部分被丢弃。
但也有例外,Solaris并不设置MSG_TRUNC,直接丢弃超出部分。
SVR4系统不丢弃超出部分,在后续的读操作中会获取超出部分。


Windows下的recv、recvfrom、WSARecv、WSARecvFrom会返回-1,并设置Last Error为WSAEMSGSIZE。
另外,WSARecvEx函数则是专门用于这方面的一个函数。

int PASCAL FAR WSARecvEx(SOCKET s, char* buf, int len, int* flags);

当*flags & MSG_PARTIAL为真实,表示数据包被截断
Windows下所有超出的数据包都会被丢弃。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表