2014-04-02 117 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