我写了一个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)
Run Code Online (Sandbox Code Playgroud)
如果服务器丢弃响应,以下行会卡在那里。
message, address = clientSocket.recvfrom(1024)
Run Code Online (Sandbox Code Playgroud)
我在这里尝试了超时方法:
Socket recv - limited wait time
但是超时会中止整个客户端程序。我只希望客户端等待 5 秒,然后如果未收到最后一个响应(由服务器丢弃),则继续发送下一个数据包。如何在客户端设置等待时间?
与的链接settimeout()是正确的。它在超时时引发异常。
设置阻塞套接字操作的超时时间。value 参数可以是表示秒的非负浮点数,也可以是 None。如果给出了一个非零值,如果超时时间值在操作完成之前已经过去,则后续的套接字操作将引发超时异常。如果给出零,则套接字处于非阻塞模式。如果给出 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)
Run Code Online (Sandbox Code Playgroud)