@@ -198,6 +198,33 @@ def make_cookie():
198198 return cookie
199199
200200
201+ def _transfer (udp , reverse , addr , s_data , buf , udp_last_send , udp_packet_id , udp_interval , stats ):
202+ if udp :
203+ if reverse :
204+ recvninto (s_data , buf )
205+ udp_in_sec , udp_in_usec , udp_in_id = struct .unpack_from (">III" , buf , 0 )
206+ if udp_in_id != udp_packet_id + 1 :
207+ stats .add_lost_packets (udp_in_id - (udp_packet_id + 1 ))
208+ udp_packet_id = udp_in_id
209+ stats .add_bytes (len (buf ))
210+ else :
211+ t = ticks_us ()
212+ if t - udp_last_send > udp_interval :
213+ udp_last_send += udp_interval
214+ udp_packet_id += 1
215+ struct .pack_into (">III" , buf , 0 , t // 1000000 , t % 1000000 , udp_packet_id )
216+ n = s_data .sendto (buf , addr )
217+ stats .add_bytes (n )
218+ else :
219+ if reverse :
220+ recvninto (s_data , buf )
221+ n = len (buf )
222+ else :
223+ n = s_data .send (buf )
224+ stats .add_bytes (n )
225+ return udp_last_send , udp_packet_id
226+
227+
201228def server_once ():
202229 # Listen for a connection
203230 ai = socket .getaddrinfo ("0.0.0.0" , 5201 )
@@ -360,6 +387,7 @@ def client(host, udp=False, reverse=False, bandwidth=10 * 1024 * 1024):
360387 else :
361388 param ["tcp" ] = True
362389 param ["len" ] = 3000
390+ udp_interval = None
363391
364392 if reverse :
365393 param ["reverse" ] = True
@@ -403,33 +431,17 @@ def client(host, udp=False, reverse=False, bandwidth=10 * 1024 * 1024):
403431 stats .stop ()
404432 else :
405433 # Send/receiver data
406- if udp :
407- if reverse :
408- recvninto (s_data , buf )
409- udp_in_sec , udp_in_usec , udp_in_id = struct .unpack_from (">III" , buf , 0 )
410- # print(udp_in_sec, udp_in_usec, udp_in_id)
411- if udp_in_id != udp_packet_id + 1 :
412- stats .add_lost_packets (udp_in_id - (udp_packet_id + 1 ))
413- udp_packet_id = udp_in_id
414- stats .add_bytes (len (buf ))
415- else :
416- # print('UDP send', udp_last_send, t, udp_interval)
417- if t - udp_last_send > udp_interval :
418- udp_last_send += udp_interval
419- udp_packet_id += 1
420- struct .pack_into (
421- ">III" , buf , 0 , t // 1000000 , t % 1000000 , udp_packet_id
422- )
423- n = s_data .sendto (buf , ai [- 1 ])
424- stats .add_bytes (n )
425- else :
426- if reverse :
427- recvninto (s_data , buf )
428- n = len (buf )
429- else :
430- # print('TCP send', len(buf))
431- n = s_data .send (buf )
432- stats .add_bytes (n )
434+ udp_last_send , udp_packet_id = _transfer (
435+ udp ,
436+ reverse ,
437+ ai [- 1 ],
438+ s_data ,
439+ buf ,
440+ udp_last_send ,
441+ udp_packet_id ,
442+ udp_interval ,
443+ stats ,
444+ )
433445
434446 elif pollable_is_sock (pollable , s_ctrl ):
435447 # Receive command
0 commit comments