Python UDP socket接收是返回单个datagram还是多块拼接?如何单次仅取1个UDP packet?
Python UDP Socket 接收行为相关问题解答
1. UDP接收返回结果是单个数据报还是拼接后的数据?
UDP本身是面向报文的传输协议,协议本身保留报文边界,Python标准库的socket接口遵循这一特性,默认调用接收方法时每次只会返回单个完整的UDP数据报,不会自动将多个数据报拼接后返回。
关于接收行为的补充说明:
- 如果你传入
recvfrom()/recv()的缓冲区长度小于当前待读取的UDP数据报长度,超出缓冲区的部分会被内核直接丢弃,不会留存到下一次接收调用中 - 不同UDP数据报的内容绝对不会被合并到同一次接收调用的返回结果里
2. 每次仅获取一个UDP packet的实现方法
实际上Python UDP socket的默认接收逻辑就已经满足这个需求,你只需要将接收缓冲区的大小设置为不小于UDP数据报的最大可能长度即可:UDP数据报的最大理论长度为65535字节(UDP首部的长度字段占16位),调用recvfrom(65535)即可保证每次读取到完整的单个UDP包,不会出现截断。
示例代码如下:
import socket # 初始化UDP套接字 udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udp_sock.bind(("0.0.0.0", 12345)) while True: # 单次调用返回单个完整UDP数据报的payload与发送端地址 payload, client_addr = udp_sock.recvfrom(65535) # 对单个UDP包的后续处理逻辑 print(f"收到来自{client_addr}的数据包,长度:{len(payload)}")
注意:不要在接收调用时添加
MSG_PEEK标志,该标志只会读取数据但不会将数据从内核接收缓冲区移除,下一次调用接收方法时会重复拿到同一个数据包。
内容的提问来源于stack exchange,提问作者FourierFlux
相关产品推荐
相关产品推荐

