2012-12-05 42 views
-1

我有一個python腳本,它通過UDP聯繫服務器並接收幾個數據報作爲迴應。我正在使用recvfrom(),它只收集第一個響應,而不是後面的響應,我知道這是預期的行爲。我應該用什麼來處理所有的答覆數據報(大約六打)?如果它實際上是recvfrom(),我應該爲循環使用什麼條件,以及我需要對套接字做什麼以便在循環中使用recvfrom()?在客戶端上接收多個UDP數據報

#!/usr/bin/python 

    import socket 

    MESSAGE = "\xFF\xFF\xFF\xFFgetservers protocol_num args" 
    endSequence = "\x45\x4f\x54\x00\x00\x00" #EOF 

    datagrams = [] 

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    sock.sendto(MESSAGE, ("master.serverlist.org", 15000)) 

    buf = sock.recvfrom(2000) [0] 

    #process... 
+0

犯錯,你有沒有考慮另一個recvfrom的()?一個循環? – EJP

+0

@EJP,我是新來的套接字(和Python),我不知道要循環什麼條件,或者是否有可能在同一套接字上執行多個recvfrom()。我試着重複這些代碼,它仍然只處理一個數據報。我需要對recvfrom()之間的套接字狀態做些什麼嗎? – thelionroars1337

+0

如果你的問題是「什麼情況下循環?或'我是否需要對套接字進行一些操作',那麼您的問題中應該出現一些相應的字詞。如果你提出模糊的問題,你會得到模糊的答案。 – EJP

回答

1
#!/usr/bin/python 

import socket 

MESSAGE = "\xFF\xFF\xFF\xFFgetservers protocol_num args" 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.sendto(MESSAGE, ("master.serverlist.org", 15000)) 

# here comes the trick 
while True: 

    buf = sock.recvfrom(2000) [0] 
    responseSequence = "\xff\xff\xff\xffgetserversResponse" 

    if buf.startswith(responseSequence): 
+0

仍然只作用於一個數據報 - 作用於第一個數據包,然後掛起,直到按下Ctrl-C。雖然也許我正在處理它錯誤? – thelionroars1337

+1

在我看來,你只收到一個數據包。由於循環是無止境的,它應該對每個接收到的數據包起作用。如果你不添加一些循環中斷邏輯,用Ctrl-C停止它是正常的。我的2美分 - 在循環內部放置打印語句,並在收到內容時打印出一條消息,以便檢查行爲。 –

+0

我不這麼認爲。它實際上是一個查詢主服務器的Quake 3 mod,服務器的數量是可預測的。遊戲內的瀏覽器列出了〜900,我的列表是〜130。缺少另外5-6包。 – thelionroars1337