You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 22:45:01