Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 如何避免UDP套接字传输限制?_Sockets_Udp_Limit_Transfer - Fatal编程技术网

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

Sockets 如何避免UDP套接字传输限制?,sockets,udp,limit,transfer,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'

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

在发送t之前,您必须将文件分成更小的块。8192是相当大的,我想你可能会在通过互联网发送时遇到麻烦,我会坚持使用512字节。还请记住,UDP不是一个可靠的协议,也就是说,您的一些数据包可能根本不存在。我建议使用TCP传输文件,它解决了使用UDP时需要自己解决的所有问题。

使用TCP传输大型文件可能是个好主意

使用udp需要做的是将文件分割成块,hanle丢失块,重试和无序PKT


使用tcp时,您不会遇到这种情况。

您达到的8192限制对应于Windows中套接字发送和接收缓冲区的大小。我很惊讶它能在1460字节以上的文件中工作,因为数据包在传输之前会被截断为1460字节或更小。您是否在同一主机内进行测试


当你明白了这一点后,你将不得不处理顺序混乱的数据包,不止一次,或者根本不处理。您确定必须使用UDP吗?这不是为外行准备的。

您所做的只是很糟糕地重新实现TCP,使用UDP的唯一原因应该是用于1对多传输或持续运行的企业服务总线中间件

使用UDP作为不可靠的单向传输,在耗尽现有定义良好的传输之后,应该被认为是一个非常小的利基解决方案

注:对于互联网上的大型数据传输,小写字母“I”仍然是唯一可靠的,您通常应该添加应用程序框架和有效负载验证


我建议调查现有的文件传输技术,如(UDP),(TCP),(优化的HTTP),或者在现有的面向消息的中间件系统(如或)之上与您自己的其他通信进行集成。

您仍然没有解释为什么必须使用UDP-它根本不是为大容量数据传输而设计的,因为它没有任何(简单的)拥塞管理

如果您发送的是VoIP,那么当不只是实时传输时,是否“尽可能快”


FWIW,典型的VoIP系统将数据打包成20毫秒左右的数据块。因此,如果您使用的是像GSM这样需要13kbps的语音编解码器,您只需将每个数据包分为260位(~32字节),并每0.02秒发送一次。

如果您必须使用UDP,请查看


它定义了一个可靠的协议。如果您的上下文允许TCP,您应该更愿意使用它。

谢谢,我需要使用UDP。。如何将文件分块?在我的例子中,我读了2kb,并发送了这个包。。这不是包的制作方法吗?我需要为每个数据包打开一个连接?不,您不需要为每个数据包打开一个新连接。考虑到您100%确信这一点,您在更新的示例中使用它的方式应该是有效的!END不会出现在您发送的数据中。谢谢,我需要使用UDP。。如何将文件分块?在我的例子中,我读了2kb,并发送了这个包。。这不是包的制作方法吗?我需要为每个数据包打开一个连接?如果你想使用UDP,那么你就浪费了很多精力。实际上,您需要复制TCP的功能。为了在高延迟链路上获得合适的传输速率,您需要在确认之前发送更多数据,并记住哪些已确认,哪些未确认。您需要容忍丢失的数据包和无序的数据包。您需要在数据包(IP校验和太弱,无法在传输大数据/重要数据时避免损坏)和其他各种东西上添加像样的校验和。我使用UDP是因为它仅用于测试目的。。我解决了将不同数据包之间的睡眠时间设置为0.0001秒的问题。。我不担心丢失数据包,因为我发送媒体文件,所以我可以容忍数据包丢失,而且我不需要高质量。。对于4mb的文件,我在两台不同的主机之间发送2000个数据包,接收1996个数据包,速度为1000 kb/s,文件质量最佳。请解释为什么需要使用UDP;如果你愿意,可以单独问一个问题。使用UDP进行文件传输是不必要的复杂,在高延迟链路上高效传输非常复杂。我需要使用UDP,因为我的项目是在本地网络中创建voip,所以我需要非常快速的数据包传输,我不需要高质量的音频,我在本地工作,所以我没有高延迟链路。。但是现在我正在测试主机之间的连接,设置配置,调整块大小和传输之间的睡眠时间。。我正在寻找最佳的折衷速度/质量(我发布了另一个问题,但没有答案…)UDP和TCP不是互斥的,应用程序可以将两者用于不同的目的。例如,许多游戏两者都使用。如果需要,您也可以使用多个TCP连接。这是家庭作业问题吗?你坚持使用UDP,这听起来像是一种人为的限制。只是在网上冲浪我就知道TCP对于实时数据传输来说太慢了。。我犯规了?谢谢。。这些就是我要找的信息。。我确信UDP是进行实时数据传输的唯一方法。。因此,我可以使用TCP连接而不会出现实时传输问题。不,如果您希望以正常音频速率实时传输VoIP数据,则应该使用UDP。请特别参阅RTP协议,这是真正的VoIP系统使用并在UDP上运行的协议。您不应该做的是“尽快”使用UDP进行批量传输。