2012-12-21 11 views
5

Ho 2 risposte UDP ad un IP di destinazione, uno dopo l'altro:Python 3 - verificare sendto() Successo

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

posso vedere con Wireshark il secondo pacchetto viene inviato. Ma il primo sembra essere ignorato.

A meno che qualcuno non veda un singhiozzo nel mio codice, c'è un modo per fare un'istruzione if su ciascuna istanza sendsock.sendto(), per garantire che il codice non continui finché non viene riconosciuto come inviato?

Inoltre, dovrei chiudere il sendock?

+0

grazie Lev. come si applica l'evidenziazione della sintassi a Python? – coffeemonitor

+0

@lev ha aggiunto il tag principale 'python' alla tua Q, quindi evidenzierà l'utilizzo di quello (i tag Python 2.x Python 3.x etc ... non lo fanno) - altrimenti, inserisci manualmente un' ! - language: lang-python -> 'prima del blocco di codice (o solo all'inizio del tuo post per renderlo predefinito) –

+0

Molto più chiaro grazie Jon. – coffeemonitor

risposta

1

Non vi è alcuna garanzia con UDP che i messaggi arrivino in modo sincrono o che arrivino addirittura a tutti, quindi non viene mai effettivamente riconosciuto come inviato a meno che non si invii una risposta di conferma dal programma ricevente. Questo è il compromesso che migliora la velocità di UDP rispetto a TCP.

È tuttavia possibile controllare il valore di ritorno di sendto (numero di byte inviati) in un ciclo while e non uscire dal ciclo while finché i byte inviati non corrispondono ai byte del messaggio originale o viene raggiunto un valore di timeout.

Inoltre, potrebbe essere più semplice utilizzare socketserver module per semplificare il processo di gestione delle prese.