等待X秒接收UDP数据包 Python
我正在用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 来设置等待的时间间隔,还可以指定重试的次数和超时时间。