Python:为数据包创建 16 位源端口和目标端口 header

Python: Creating 16-bit source and destination ports for a packet header

我正在 python 中的 UDP 之上的应用程序 space 中创建一个网络协议作为家庭作业。我需要将源端口和目标端口表示为 16 位数字。所有尝试都失败了。

我测试它的方法是创建一个 udp 套接字并查看 sendto() 的 return 值。这是典型的套接字代码:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
addr = ("127.0.0.1", 1234)

端口范围从 0 到 65535。假设我选择端口 65000。我想要 sendto() 到 return 2(发送 2 个字节 = 16 位)。这是我尝试过的:

我调用以下命令并得到:

>>>mySock.sendto(655000, addr)
TypeError: must be string or buffer, not int

好的,让我们尝试使用 bytes()

>>>mySock.sendto(bytes(65000), addr)
5

嗯,这不是我想要的。那就是把每个数字变成一个字符,就是一个字节。

如果我用 0x0000 按位或它呢?

>>>mySock.sendto(bytes(65000 | 0x0000), addr)
5

好吧,该死的!我最接近的事情是搞乱 hex()bytearray()。见下文。

>>>hex(65000)
'0xfde8'
>>>mySock.sendto('\xfde8', addr)
3

那不应该说2个字节吗?我不确定这是如何工作的。另外,当数字小于 16384 时,我想保留前面的 0。因此,例如,如果端口号是 255 (0b0000000011111111),我希望它保留为 2 字节数据结构 (0x00FF),而不是截断为 0xFF 或 0b11111111。

如果要发送二进制数据,请使用模块struct。这将帮助您对字符串进行编码并确保您使用的是正确的字节顺序。例如:

>>> import struct
>>> struct.pack('!H', 65000)
'\xfd\xe8'

这是 65000 作为一个无符号短整数,按网络顺序(大端)