`
zhangyafei_kimi
  • 浏览: 261692 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

UDP数据包截断

阅读更多
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下所有超出的数据包都会被丢弃。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics