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下所有超出的数据包都会被丢弃。

你可能感兴趣的:(Pascal,Socket,Windows,Solaris)