在python

时间:2019-07-11 20:05:34

标签: python networking udp

我正在尝试通过UDP点对点发送数据(循环回到第二个NIC),但是丢失了数据。这是代码(来自:sending/receiving file UDP in 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()

----- receiver.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个模式)

我发现,如果我在sender的while循环中添加一个延迟以延迟0.0005秒,那么它可以正常工作,并且我可以发送任意数量的数据。如果我将延迟降低到0.0001,那么它将再次失败。我的速度大约是1.5MB /秒

我会很高兴提出任何改善我的表现的建议。我在想,也许有一个接收缓冲区正在溢出,而我只是读得不够快。

0 个答案:

没有答案