14

大多数数据报接收函数,如 c 的 recv 或 read、javas DatagramPacket 类或 pythons SocketServer,都包括找出接收数据量的可能性。

C:

int amount = recv(sock, buf, n, MSG_WAITALL);

爪哇:

int amount = datagramSocket.getLength();

Python:

class MyUDPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        amount = len (self.request[0])

这些可靠吗?或者是否有可能只收到部分消息,例如由于数据包碎片或网络延迟?
换句话说:当我通过 udp 发送一个可变长度的数据块并在另一端接收它时,这些数量值是否完全等于原始块的大小?

编辑:
ninjalj 提出了一个很好的观点,我想把它包括在这里。当接收函数被中断时会发生什么,例如被信号中断?当两个线程同时尝试从同一个套接字接收时会发生什么?

4

2 回答 2

14

UDP 数据报不能部分传送¹;它们按原样交付或根本不交付。所以是的,您可以确定接收到的数据报与您在接收端看到的完全一样。

编辑以合并 Will 的评论,这是最好的正确(即技术上):

¹它们可以在 IP 级别进行分段,但接收方的网络堆栈将完全重组数据报并将其传递给已发送的侦听进程,或者根本不会确认已收到任何数据。

于 2011-10-28T16:00:35.683 回答
4

部分数据报仅允许使用UDP Lite

于 2011-11-06T02:36:32.427 回答