数据报是否总是完全收到?

XZS*_*XZS 14 c python java udp datagram

大多数数据报接收函数,如c的recv或read,javas DatagramPacket类或pythons SocketServer,都可以找出接收到的数据量.

C:

int amount = recv(sock, buf, n, MSG_WAITALL);
Run Code Online (Sandbox Code Playgroud)

Java的:

int amount = datagramSocket.getLength();
Run Code Online (Sandbox Code Playgroud)

蟒蛇:

class MyUDPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        amount = len (self.request[0])
Run Code Online (Sandbox Code Playgroud)

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

编辑:
ninjalj提出了一个很好的观点,我想在此处加入.当接收功能被中断时会发生什么,例如通过信号?当两个线程同时尝试从同一个套接字接收时会发生什么?

Jon*_*Jon 14

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

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

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

  • 技术上大的数据包可以被分段,但协议处理碎片和重组,如果它不能完全重新组装,它被标记为丢失,因此用户将永远不会注意到. (8认同)
  • 但是,如果你的recv()缓冲区不足以容纳数据包,你将得到截断的数据. (2认同)