2014-04-02 52 views
0

我正在做一个在Python中注册到服务器的客户端。该客户端将一个UDP数据包发送到register,并等待来自服务器的register accepted响应数据包。等待X秒钟收到一个UDP数据包Python

有一些数据包丢失的可能性,因为它是UDP,所以我需要的代码:

发送数据包,并等待5秒响应,如果没有收到报文,再次发送数据包,然后等待10秒,如果已经没有响应,现在15秒,如果再次没有响应,则打破循环。

我的问题是,接收数据包我做:

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

而且rcvfrom是阻塞的方法。我搜索了一下,我认为使用select我可以知道什么时候收到一个包,然后读取套接字并获取它,但我不知道如何去做,我没有找到我正在做的简单示例。

有人可以给我一些帮助吗?

谢谢!

回答

1

这是一件容易的事与scapy

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

SR是sendreceice功能,你可以指定一个等待的时间间隔与国米和重试&超时数。

+0

谢谢,我会尽力给你报告! – rul3s

+0

哦,男人!它需要根,而且我必须做到这一点没有root权限! – rul3s

0

如果您将套接字设置为非阻塞,则可以轻松实现此目的。后声明插座做:

skt1.setblocking(0) 

通过这样做,如果recvfrom的(),没有收到一个包时,它会提高你可以处理和继续前进,像这样的错误:

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