2013-04-09 8 views
5

Ich versuche, einen Stop-and-Wait-Algorithmus zu implementieren. Ich habe ein Problem bei der Implementierung des Timeouts beim Absender. Während ich auf einen ACK vom Empfänger warte, verwende ich die Funktion recvfrom(). Dies macht jedoch das Programm im Leerlauf, und ich kann das Zeitlimit für die erneute Übertragung nicht einhalten.Python-Implementierung für Stop-and-Wait-Algorithmus

hier ist mein Code:

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() 

Antwort

1

Steckdosen Block standardmäßig. Verwenden Sie die Socket-Funktionen setblocking() oder settimeout(), um dieses Verhalten zu steuern.

wenn Sie Ihr eigenes Timing machen möchten.

mysocket.setblocking(0) 
ACK, address = mysocket.recvfrom(1024) 

aber ich würde etwas tun, wie

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() 
+0

Sie sollten wirklich nicht eine leere except-Klausel verwenden, sofern Sie nicht die Ausnahme sind Erneutes Auslösen. Du weißt, es wird ein socket.timeout sein, also warum nicht nur diesen fangen? – drxzcl

+0

@drxzcl gerade hinzugefügt, dass;) – cmd

+0

'während nicht bestätigt 'statt' während bestätigt 'oder habe ich etwas verpassen? – mtahmed