如何避免UDP套接字传输限制?

时间:2010-09-26 11:32:27

标签: sockets udp limit transfer

我编写了一个程序,通过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()

6 个答案:

答案 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),或者与其他通信进行集成在现有的面向消息的中间件系统上方,例如JBoss0MQ

答案 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,您应该更喜欢使用它。