2012-12-05 43 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