我在理解recv()/ recvfrom()从非阻塞UDP套接字返回时遇到问题。在C中的非阻塞udp套接字编程:我得到什么?
更具体一点,并与TCP(请纠正我,如果我错了):直到
阻塞套接字(TCP或UDP)将不会从一个recv的返回()有是缓冲区中的一些数据。这可能是一些字节数(TCP)或完整的数据报(UDP)。
一个非阻塞的TCP套接字或者返回EWOULDBLOCK(linux)/ WSAEWOULDBLOCK(windows)或者当前在缓冲区中的字节。由于TCP数据是一个流,返回多少字节并不重要。
现在的问题:
- 非阻塞UDP套接字也返回WOULDBLOCK(Linux)的/ WSAEWOULDBLOCK(窗口),如果没有可用数据。但是,如果有数据可用,那么非阻塞UDP套接字是否只返回一些字节,这可能意味着您只能获得数据报的一半或者UDP套接字始终返回完整的数据报?
编辑:
我指的是“一个数据包的一半”的是:会发生什么,如果我可以调用recv()在短短的时刻插座当前正在接收数据报。在那一刻,缓冲区中有一些字节,但数据报尚未完成。
您的解释和意见,赞赏。谢谢!
它看起来像是可以在Linux中传递和接收MSG_TRUNC标志到'recvmsg'。在手册页recv(2)中记录。另一方面,也许我误读了,但是我只能找到'socket(2)'的manpage中记录的丢弃行为,它只为'SOCK_SEQPACKET'套接字提及。我从来没有亲自使用过这些。 – 2010-02-11 09:10:58
'MSG_TRUNC'作为'recv(2)'的参数不是标准的。它在FreeBSD或Mac OS X上都不可用(我目前可以访问的系统,其他人可能也适用)。 'MSG_TRUNC'可以在'struct msghdr'的'flags'成员的Linux,FreeBSD和Mac OS X上传递给'recvmsg(2)'。在任何情况下,即使使用Linux上的'recv(2)',如果传递的缓冲区不够大,数据报将被截断。如果在那里使用MSG_TRUNC,调用者必须检查返回值并将其与缓冲区的大小进行比较。它会知道数据丢失,但仍然丢失。 – 2010-02-11 16:07:16
谢谢!这意味着UDP是**真的**数据包导向... – Uwe 2010-02-11 17:34:43