我编写了一个程序,通过udp套接字连接将文件从客户端发送到服务器..程序正常工作但如果我传输的文件大于8192 kb,则流停止并且我收到的文件已损坏。 我该如何避免这种限制?
server.py
host = ...
port = ...
filename = ...
buf = 2048
addr = (host, port)
UDPSock = socket(AF_INET, SOCK_DGRAM)
UDPSock.bind(addr)
f = open(filename, 'wb')
block,addr = UDPSock.recvfrom(buf)
while block:
if(block == "!END"): # I put "!END" to interrupt the listener
break
f.write(block)
block,addr = UDPSock.recvfrom(buf)
f.close()
UDPSock.close()
client.py
host = ...
port = ...
filename = ...
buf = 2048
addr = (host, port)
UDPSock = socket(AF_INET, SOCK_DGRAM)
f = open(filename, 'rb')
block = f.read(buf)
while block:
UDPSock.sendto(block, addr)
block = f.read(buf)
UDPSock.sendto("!END", addr)
f.close()
UDPSock.close()
答案 0 :(得分:2)
在发送t之前,您必须将文件拆分为较小的块。 8192是相当大的,我认为你通过互联网发送它可能会遇到麻烦,我会坚持512字节。还要记住UDP不是一个可靠的协议,即你的一些数据包可能根本就没有。我建议使用TCP传输文件,它解决了使用UDP时你必须自己解决的所有麻烦。
答案 1 :(得分:1)
将tcp用于大型文件传输可能是个好主意。
使用udp需要做的是将文件拆分成块,丢失丢失的块,重试和乱序pkts。
使用tcp你不会。
答案 2 :(得分:1)
你击中的8192限制对应于套接字发送的大小&在Windows中接收缓冲区。我很惊讶它对1460字节以上的文件起作用,因为数据包在被放到线上之前会被截断到那个或更小。你在同一个主机上测试吗?
当你想到这一点时,你将不得不处理无序的数据包,不止一次,或根本不处理。你确定你必须使用UDP吗?这不是没有经验的人。
答案 3 :(得分:1)
您所做的一切都是非常糟糕地重新实现TCP,使用UDP的唯一原因应该是1对多传输或不断运行的企业服务总线中间件。
在耗尽现有明确定义的传输之后,使用UDP作为不可靠的单向传输应被视为一个非常小的利基解决方案。
对于通过互联网进行大量数据传输的注意事项,小写“I”仍然只是可靠的,您通常应该添加应用程序框架和有效负载验证。
我建议调查现有的文件传输技术,例如FSP(UDP),HTTP(TCP),SPDY(优化的HTTP),或者与其他通信进行集成在现有的面向消息的中间件系统上方,例如JBoss或0MQ。
答案 4 :(得分:1)
您仍然没有解释为什么必须使用UDP - 它不是为高容量数据传输而设计的,因为它没有任何(简单的)拥塞管理。
如果您要发送VoIP,那么不是简单地实时传输,而不是“尽可能快”?
FWIW,典型的VoIP系统将数据分组为20ms块或左右。因此,如果您使用的是GSM等需要13 kbps的语音编解码器,则每个数据包只需要插入260位(~32字节),并每0.02秒发送一次。
答案 5 :(得分:1)
如果必须使用UDP,请查看http://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol
它定义了一个可靠的协议。如果您的上下文允许TCP,您应该更喜欢使用它。