如何发送具有确切大小的UDP数据包?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何发送具有确切大小的UDP数据包?相关的知识,希望对你有一定的参考价值。

我在Python中有一个简单的客户端/服务器程序,使用UDP。我需要发送一个包含大小正好为120字节的消息和报头的数据包。 (数据包总大小为120 + sizeof(header)。)

我该怎么办? MESSAGE的内容应该是什么?

我的代码:

MESSAGE = "?120B?"

sock = socket.socket(socket.AF_INET, 
                     socket.SOCK_DGRAM) 
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
答案
def sendPacket(data,sock,data_size):
    packets = ["%s"%data[i:i+data_size] for i in range(0,len(data),data_size)]
    packets[-1] = packets[-1] + "x00"*(len(data)%data_size)
    for p in packets:
        sock.sendto(p,*ADDRINFO)

sendPacket("hello",sock,120)
sendPacket("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum",sock,120)

会将任何给定数据分成120byte数据包

另一答案

您可以使用ljust方法将字符串填充到固定长度:

>>> MESSAGE.ljust(120)
'?120B?                                                                                                                  '

但是,如果字符串的长度超过120,ljust将不会截断它。你可以通过这样做手动完成:

MESSAGE.ljust(120)[:120]

上面的示例将默认使用空格填充字符串。您可以选择指定自定义填充字符(例如空字符):

MESSAGE.ljust(120, '')[:120]

看起来你想用空字符填充字符串,但请记住,如果没有给出长度,接收器可能会在到达第一个空字符时关闭字符串。我猜你打算在标题中存储字符串的长度,如果你这样做,你应该没有任何问题。

以上是关于如何发送具有确切大小的UDP数据包?的主要内容,如果未能解决你的问题,请参考以下文章

UDP数据包字节读取粒度?

如何确定/设置套接字缓冲区大小?

如果我发送的UDP数据包大小大于2个较小的MTU,会发生什么情况?

使用getaddrinfo和bind发送具有固定源端口号的UDP数据包

如果我在 C# 中发送 0 有效载荷数据,udp 数据包的大小是多少?

Erlang Udp 服务器丢弃大量数据包