我正在尝试实现停止和等待算法。我在发件人实施超时时遇到问题。在等待来自接收方的ACK时,我正在使用recvfrom()函数。但是这会使程序空闲,我无法按照超时来重新传输。
这是我的代码:
import socket
import time
mysocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
ACK= " "
userIn=raw_input()
if not userIn : break
mysocket.sendto(userIn, ('127.0.0.01', 88))
ACK, address = mysocket.recvfrom(1024) #the prog. is idle waiting for ACK
future=time.time()+0.5
while True:
if time.time() > future:
mysocket.sendto(userIn, ('127.0.0.01', 88))
future=time.time()+0.5
if (ACK!=" "):
print ACK
break
mysocket.close()
答案 0 :(得分:1)
默认情况下为套接字块。使用套接字函数setblocking()或settimeout()来控制此行为。
如果你想做自己的时间。
mysocket.setblocking(0)
ACK, address = mysocket.recvfrom(1024)
但我会做类似
的事情import socket
mysocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
mysocket.settimeout(0.5)
dest = ('127.0.0.01', 88)
user_input = raw_input()
while user_input:
mysocket.sendto(user_input, dest)
acknowledged = False
# spam dest until they acknowledge me (sounds like my kids)
while not acknowledged:
try:
ACK, address = mysocket.recvfrom(1024)
acknowledged = True
except socket.timeout:
mysocket.sendto(user_input, dest)
print ACK
user_input = raw_input()
mysocket.close()