2012-12-21 13 views
5

Mam 2 odpowiedzi UDP do docelowego adresu IP, jeden po drugim:Python 3 - sprawdza sendto() Sukces

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

widzę z Wireshark druga paczka zostanie wysłana. Ale pierwszy wydaje się być ignorowany.

Jeśli ktoś nie widzi czkawki w moim kodzie, czy istnieje sposób na wykonanie instrukcji if na każdej instancji sendsock.sendto(), aby upewnić się, że kod nie będzie kontynuowany, dopóki nie zostanie potwierdzony jako wysłany?

Czy powinienem też zamknąć przesyłkę?

+0

dzięki Lev. Jak zastosować kolorowanie składni do Pythona? – coffeemonitor

+0

@lev dodał główny znacznik 'python' do twojego Q, więc podkreśli to używając tego (Python 2.x Python 3.x itd ... tagi tego nie robią) - w przeciwnym razie po prostu ręcznie wstaw w' ' ! - language: lang-python -> 'before the code block (lub tylko u góry posta, aby uczynić go domyślnym) –

+0

Znacznie wyraźniejsze dzięki Jon. – coffeemonitor

Odpowiedz

1

Z UDP nie można zagwarantować, że wiadomości pojawią się synchronicznie lub w ogóle się pojawią, więc nigdy nie zostaną potwierdzone jako wysłane, chyba że wyślesz odpowiedź potwierdzenia z programu odbiorczego. To jest kompromis, który poprawia szybkość UDP w porównaniu z TCP.

Można jednak sprawdzić zwracaną wartość sendto (liczba wysłanych bajtów) w pętli while i nie wychodzić z pętli while, dopóki bajty wysłane nie odpowiadają bajtom oryginalnej wiadomości lub osiągnięta zostanie wartość limitu czasu.

Ponadto łatwiejsze może być korzystanie z socketserver module, aby uprościć proces obsługi gniazd.