大多数数据报接收函数,如c的recv或read,javas DatagramPacket类或pythons SocketServer,都可以找出接收到的数据量 .
C:
int amount = recv(sock, buf, n, MSG_WAITALL);
Java的:
int amount = datagramSocket.getLength();
蟒蛇:
class MyUDPHandler(socketserver.BaseRequestHandler):
def handle(self):
amount = len (self.request[0])
这些可靠吗?或者是否可能只收到部分消息,例如数据包碎片或网络延迟?
换句话说:当我通过udp发送一个可变长度的数据块并在另一端接收它时,这些数量值是否恰好等于原始块的大小?
编辑:
ninjalj提出了一个很好的观点,我想在此处加入 . 当接收功能被中断时会发生什么,例如通过信号?当两个线程同时尝试从同一个套接字接收时会发生什么?
2 回答
UDP数据报不能部分传递¹;它们按原样交付或根本不交付 . 所以,是的,您可以确定收到的数据报的发送方式与您在接收方端看到的完全相同 .
编辑以合并Will的评论,这是最好的正确(即技术上):
¹它们可以在IP级别进行分段,但接收方的网络堆栈将完全重新组合数据报并将其传递给发送时的监听过程,或者不会确认已收到任何数据 .
部分数据报仅允许使用UDP Lite .