我在理解 recv()/recvfrom() 从非阻塞 UDP 套接字返回什么时遇到了问题。
更具体一点,与 TCP 相比(如果我错了,请纠正我):
在缓冲区中有一些数据之前,阻塞套接字(TCP 或 UDP)不会从 recv() 返回。这可能是一些字节数 (TCP) 或完整的数据报 (UDP)。
非阻塞 TCP 套接字返回 EWOULDBLOCK (linux) / WSAEWOULDBLOCK (windows) 或当前在缓冲区中的字节。由于 TCP 数据是一个流,因此返回多少字节并不重要。
现在的问题:
- 如果没有可用数据,非阻塞 UDP 套接字也会返回 WOULDBLOCK (linux) / WSAEWOULDBLOCK (windows)。但是,如果有数据可用,非阻塞 UDP 套接字是否只返回一些字节,这可能意味着您只能获得一半的数据报,或者 UDP 套接字是否总是返回完整的数据报?
编辑:
我所说的“一半数据报”的意思是:如果我在套接字当前正在接收数据报的那一刻调用 recv() 会发生什么。在那一刻,缓冲区中有一些字节,但数据报还没有完成。
感谢您的解释和评论。谢谢!