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

如何基于recv()的settimeout()实现UDP报文重传机制?

UDP报文重传逻辑实现方案

核心思路

通过给UDP套接字设置接收超时,结合无限循环实现「发送-等待响应-超时重发」的逻辑:发送报文后等待1秒,未收到响应则立即重发,直到成功接收响应为止。

代码实现(以Python为例)

import socket

# 配置目标地址、端口和要发送的报文
TARGET_IP = "192.168.1.100"
TARGET_PORT = 8888
SEND_DATA = b"Your UDP Message Here"

# 创建UDP套接字
udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 设置接收超时为1秒
udp_sock.settimeout(1.0)

try:
    while True:
        # 发送UDP报文
        udp_sock.sendto(SEND_DATA, (TARGET_IP, TARGET_PORT))
        print("报文已发送,等待响应...")
        
        try:
            # 尝试接收响应
            resp, server_addr = udp_sock.recvfrom(1024)
            print(f"收到响应来自 {server_addr}: {resp.decode('utf-8')}")
            # 成功接收响应,退出循环
            break
        except socket.timeout:
            # 超时未收到响应,触发重发
            print("超时未收到响应,正在重发...")
finally:
    # 关闭套接字释放资源
    udp_sock.close()

关键细节说明

  • 超时设置:settimeout(1.0) 给套接字的recvfrom()方法设置1秒超时,超时会抛出socket.timeout异常,我们通过捕获这个异常触发重发逻辑。
  • 无限循环:外层while True确保只要没收到响应,就会持续重复发送报文。如果需要限制重发次数,可以添加计数器(比如retry_count = 0,每次超时retry_count +=1,达到阈值后break)。
  • 报文标识:实际业务中建议给每个报文添加唯一ID,避免服务器收到重复重发的报文时重复处理。

内容的提问来源于stack exchange,提问作者Sliced_ice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:18:23