2012-12-21 15 views
5

I 2 UDP-Antworten auf eine Ziel-IP haben, ein Recht nach dem anderen:Python 3 - überprüfen sendto() Erfolg

sendsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) 
sendsock.bind(('%s' % ip_adr, 1036)) 

#send first packet 
ok_response = "Reception Success, more to come" 
str2bytes = bytes(ok_response,'utf-8') 
sendsock.sendto(str2bytes, ("%s" % phone.ip_addr, int(phone.sip_port))) 

#send second packet 
ok_response = "Fun data here" 
str2bytes = bytes(ok_response,'utf-8') 
sendsock.sendto(str2bytes, ("%s" % phone.ip_addr, int(phone.sip_port))) 

ich mit Wireshark das zweite Paket wird gesendet sehen. Aber das erste scheint ignoriert zu werden.

Wenn jemand in meinem Code keinen Schluckauf sieht, gibt es eine Möglichkeit, eine if-Anweisung für jede sendsock.sendto() Instanz zu erstellen, um sicherzustellen, dass der Code erst dann weiter verarbeitet wird, wenn er als gesendet bestätigt wird?

Auch sollte ich den Sendsock schließen?

+0

danke Lev. Wie wenden Sie Syntax-Highlighting auf Python an? – coffeemonitor

+0

@lev hat das Haupt-'python'-Tag zu Ihrem Q hinzugefügt, so dass es hervorgehoben wird, dass es verwendet wird (Python 2.x Python 3.x etc ... Tags tun das nicht) - andernfalls setzen Sie einfach ein' < ! - language: lang-python -> 'vor dem Codeblock (oder einfach oben in deinem Post, um es zu einem Standard zu machen) –

+0

Viel klarer dank Jon. – coffeemonitor

Antwort

1

Es gibt keine Garantie mit UDP, dass die Nachrichten synchron ankommen oder überhaupt ankommen, so dass sie niemals wirklich als gesendet bestätigt werden, es sei denn, Sie senden eine Bestätigungsantwort vom Empfängerprogramm zurück. Das ist der Kompromiss, der die Geschwindigkeit von UDP gegenüber TCP verbessert.

Sie könnten jedoch den Rückgabewert sendto (Anzahl der gesendeten Bytes) in einer while-Schleife überprüfen und die while-Schleife nicht beenden, bis die gesendeten Bytes den Bytes der ursprünglichen Nachricht entsprechen oder ein Zeitlimit erreicht ist.

Auch könnte es einfacher sein, die socketserver module zu verwenden, um den Prozess der Handhabung Ihrer Sockets zu vereinfachen.