Python:通过UDP发送大对象

时间:2015-08-20 18:32:27

标签: python sockets networking udp

我是套接字编程的新手,最近为它选择了Python。我有几个问题,我似乎无法找到明确的答案。

我正在寻找通过UDP发送数据并编写一个简单的python脚本来做到这一点。可以很好地发送小对象(确切地说是小的腌制对象),但是我应该如何处理太大而无法安装在一个UDP数据包中的对象?

我想过要先以字节为单位调整对象的大小。如果对象足够小以适合UDP数据包,则不会做任何事情,但如果对象太大,则对象将被均匀地分割(如果可能)到许多较小的块中,以便它可以适合多个UDP数据包并发送到客户端。一旦客户端收到块,客户端就会将多个UDP数据包重组为原始状态。

在尝试实施上述提到的时候,我立刻碰到了我的第一块砖墙。

从我的研究结果来看,似乎没有任何“有效”的方法来获取对象的字节大小。这意味着我无法确定某个对象是否太大而无法容纳在UDP数据包中。

如果我坚持向客户端发送大型对象会怎样?它会自动分段并在客户端重新组装,还是由客户端丢弃数据包?

通过UDP处理大对象的正确方法是什么?请记住,大对象可以是1GB大小的文件,也可以是大小为25MB的字节对象。

提前致谢。

附注:

  • 我知道UDP数据包可能并不总是按顺序排列 因此,我已经实施了对策 将序列号标记为发送给客户端的UDP数据包。

  • 我知道无法保证客户端将收到所有UDP数据包。我现在不担心丢包。

  • 我确实理解TCP是我正在尝试做的事情的合适人选,但我正专注于理解UDP以及如何处理目前无法从客户端确认数据包的情况。

  • 我确实理解泡菜的用法是不安全的。将在稍后阶段进行调查。

3 个答案:

答案 0 :(得分:2)

UDP数据包可以大到约64k。因此,如果您想发送一个大于该文件的文件,您可以将自己分成64k的数据包。这是理论上的最大值。我的建议是使用500字节的小块片段。

如果您使用64k数据包,则IP负责数据包的分段和重组。 500字节的较小数据包不可能被分段,因为mtu通常约为1500字节。如果您使用较大的碎片数据包,那么如果其中一个碎片丢失,IP就会丢弃它们。

你是对的,使用TCP可能更适合用于像这样的东西,甚至像TFTP这样的现有协议。它实现了每个数据包的acking机制和序列号,就像你一样。

答案 1 :(得分:1)

大多数处理套接字的应用程序可能会将数据存储在内存中,直到全部发送完毕。馊主意!我有一个产品应用程序,必须通过Web发送非常大的文件,并在过去使用了分块方法。我刚用Python重写了一些代码(binfileio)。在我的应用程序中,我已经将chuck文件发送到一个保留的文件夹中,一旦所有的块文件都藏在床上,我就重新组装它们。我从不信任通过电线发送大型文件,这些文件可能随时被切断。希望这会有所帮助。

答案 2 :(得分:0)

Pytho 3.0

通过UDP通信发送数据的代码

import socket
UDP_IP = "127.0.0.1"
UDP_PORT = 5005
MESSAGE = "Hello, World!"
print("UDP target IP:",UDP_IP)
print("UDP target port:",UDP_PORT)
print("message:",MESSAGE)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.sendto(bytes(MESSAGE, "utf-8"), (UDP_IP, UDP_PORT))