【问题标题】:Python: Creating 16-bit source and destination ports for a packet headerPython:为数据包头创建 16 位源端口和目标端口
【发布时间】:2015-11-25 00:49:53
【问题描述】:

我正在 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。

【问题讨论】:

  • len('\xfde8') 是 3,因为那里有 3 个字符:('\xfd', 'e', '8')

标签: python sockets byte port sendto


【解决方案1】:

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

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

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

【讨论】:

  • 你我的朋友,是一个python精灵。 H 是什么意思?十六进制?
猜你喜欢
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多