等待X秒接收UDP数据包 Python

0 投票
2 回答
2732 浏览
提问于 2025-04-18 00:59

我正在用Python做一个客户端,这个客户端要注册到一个服务器上。这个客户端会发送一个UDP数据包来进行注册,然后等待服务器的注册成功的回应数据包。

因为使用的是UDP,所以有可能会丢失一些数据包。因此我需要写一些代码来:

发送数据包后等待5秒钟,如果没有收到回应,就再发送一次数据包,然后等10秒,如果还是没有回应,就再等15秒,如果还是没有回应,就结束这个循环。

我现在的问题是,我在接收数据包时使用的是:

skt1.sendto(pqtUdp,(srvAdr,prtUdp))
data,addrs = skt1.recvfrom(56)

而且rcvfrom是一个阻塞的方法。我查了一下,觉得可以用select来判断什么时候收到数据包,然后再读取套接字来获取数据包,但我不知道该怎么做,也找不到适合我这个情况的select的简单例子。

有人能帮帮我吗?

谢谢!

2 个回答

0

如果你把套接字设置为非阻塞模式,这样就能很简单地实现这个功能。在你声明套接字之后,执行以下操作:

skt1.setblocking(0)

这样做之后,如果recvfrom()没有收到数据包,它会产生一个错误,你可以处理这个错误,然后继续进行,像这样:

try:
    skt1.recvfrom(64)
except socket.error:
    pass
1

这项任务用 scapy 来做非常简单:

>>> sr(IP(dst="172.20.29.5/30")/UDP(dport=[21,22,23]),inter=5,retry=2,timeout=1)

sr 是一个发送和接收的函数,你可以通过 inter 来设置等待的时间间隔,还可以指定重试的次数和超时时间。

撰写回答