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下所有超出的数据包都会被丢弃。
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下所有超出的数据包都会被丢弃。
本文介绍了Posix系列的recv、recvfrom、read等函数在处理数据包时的限制及如何检测数据包是否被截断。recvmsg可通过msg_flags&MSG_TRUNC判断数据包是否被截断。Solaris直接丢弃超出部分而不设置标志。SVR4系统保留超出部分供后续读取。Windows通过设置LastError为WSAEMSGSIZE或使用WSARecvEx函数的MSG_PARTIAL标志来指示数据包被截断。
3420

被折叠的 条评论
为什么被折叠?



