我写了一个udp服务器和客户端。客户端将简单的udp消息发送到服务器,服务器将响应。服务器将随机丢弃一些响应数据包。在我的客户端代码中,我写了以下一行
for i in range(0,10):
sequence_number = i
start = time.time()
clientSocket.sendto("Ping " + str(i) + " " + str(start), server)
# Receive the client packet along with the address it is coming from
message, address = clientSocket.recvfrom(1024)
end = time.time()
if message != '':
print message
rtt = end - start
print "RTT = " + str(rtt)
如果服务器删除响应,则以下行停留在那里。
message, address = clientSocket.recvfrom(1024)
我在这里尝试了超时方法:
Socket recv - limited wait time
但超时将中止整个客户端程序。我只是希望客户端等待5秒钟,然后如果没有收到最后一个响应(由服务器丢弃),则继续发送下一个数据包。
如何在客户端设置等待时间?
答案 0 :(得分:4)
与settimeout()
的链接是对的。超时时会引发异常。
阻止套接字操作设置超时。 value参数可以是 表示秒的非负浮点数,或无。如果一个 给出非零值,后续套接字操作将引发一个 如果超时期限值已经超过,则超时异常 操作已经完成。如果给出零,则插入套接字 非阻塞模式。如果给出None,则套接字被置于阻塞状态 模式。
您需要将代码放在try
块中,以便异常不会中止您的程序。
import socket.timeout as TimeoutException
# set timeout 5 second
clientsocket.settimeout(5)
for i in range(0,10):
sequence_number = i
start = time.time()
clientSocket.sendto("Ping " + str(i) + " " + str(start), server)
# Receive the client packet along with the address it is coming from
try:
message, address = clientSocket.recvfrom(1024)
except TimeoutException:
print("Timeout!!! Try again...")
continue
end = time.time()
if message != '':
print message
rtt = end - start
print "RTT = " + str(rtt)
答案 1 :(得分:0)
只需使用此
可读,空,空= select.select(服务器,[],[],10)#等待10秒
ready_server = readable[0]