数据报总是完整接收吗?
大多数接收数据报的函数,比如C语言的recv或read,Java的DatagramPacket类,或者Python的SocketServer,都可以告诉你接收到的数据量。
C语言示例:
int amount = recv(sock, buf, n, MSG_WAITALL);
Java示例:
int amount = datagramSocket.getLength();
Python示例:
class MyUDPHandler(socketserver.BaseRequestHandler):
def handle(self):
amount = len (self.request[0])
这些方法可靠吗?或者说,有可能只收到消息的一部分吗?比如因为数据包分片或者网络延迟等原因。
换句话说,当我通过UDP发送一个可变长度的数据块,并在另一端接收时,这些接收到的数据量是否和原始数据块的大小完全一致?
补充:
ninjalj提到一个很好的观点,我想在这里加上。接收函数如果被打断,比如说被信号中断,会发生什么?如果两个线程同时尝试从同一个套接字接收数据,又会怎样呢?
2 个回答
4
部分数据报只有在使用UDP Lite时才是允许的。
14
UDP 数据报不能被部分接收;要么完整接收,要么根本不接收。所以,你可以放心,接收到的数据报和发送时的内容完全一致。
编辑:加入了 Will 的评论,这是最正确的说法(也就是从技术上讲):
¹虽然它们可以在 IP 层被分片,但接收端的网络处理系统要么会将数据报完整地重新组装好,然后像发送时那样传递给监听的程序,要么就根本不承认有任何数据被接收。