Python:为数据包标头

时间:2015-11-25 00:49:54

标签: python sockets byte port sendto

我正在使用python中的UDP顶层的应用程序空间中创建一个网络协议,用于作业。我需要将源端口和目标端口表示为16位数字。所有尝试都失败了。

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

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

端口范围从0到65535.假设我选择65000的端口。我希望sendto()返回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。

1 个答案:

答案 0 :(得分:0)

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

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

这是65000作为无符号短片,按网络顺序(大端)