Проблемы с отправкой / получением UDP в Python - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь отправить данные через UDP точка-точка (возврат к второй сетевой карте), но я теряю данные.Вот код (из: отправка / получение файла UDP в python ):

----- sender.py ------

#!/usr/bin/env python

from socket import *
import sys

s = socket(AF_INET,SOCK_DGRAM)
host =sys.argv[1]
port = 9999
buf =1024
addr = (host,port)

file_name=sys.argv[2]

s.sendto(file_name,addr)

f=open(file_name,"rb")
data = f.read(buf)
while (data):
    if(s.sendto(data,addr)):
        #print "sending ..."
        data = f.read(buf)
s.close()
f.close()

----- receive.py -----

#!/usr/bin/env python

from socket import *
import sys
import select

host="192.0.0.2" #second nic
port = 9999
s = socket(AF_INET,SOCK_DGRAM)
s.bind((host,port))

addr = (host,port)
buf=1024

data,addr = s.recvfrom(buf)
print "Received File:",data.strip()
f = open(data.strip(),'wb')

data,addr = s.recvfrom(buf)
try:
    while(data):
        f.write(data)
        s.settimeout(2)
        data,addr = s.recvfrom(buf)
except timeout:
    f.close()
    s.close()
    print "File Downloaded"

Я создаю свой файл с помощью dd:

dd if=/dev/urandom of=test_file bs=1024 count=100

Я обнаружил, что когда счет превышает 100, он начинаетсятерпеть неудачу.Я пробовал разные bs вплоть до 32, и все равно не получается.Когда я меняю bs, я изменяю buf в коде, чтобы он соответствовал.Я повторяю создание нового файла и выполнение команды в цикле.При разных комбинациях иногда происходит сбой при каждой передаче, иногда происходит сбой в шаблоне (т. Е. Каждые 5)

Я обнаружил, что если я добавлю задержку в цикле while в отправителе для задержки на 0,0005 секунд, то это сработаетхорошо, и я могу отправить любое количество данных.Если я уменьшу задержку до 0,0001, то снова произойдет сбой.Я получаю примерно 1,5 МБ / с

Буду признателен за любые рекомендации по улучшению моей производительности.Я думаю, что, возможно, переполнен приемный буфер, и я просто недостаточно быстро его читаю.

...