Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:为数据包头创建16位源端口和目标端口_Python_Sockets_Byte_Port_Sendto - Fatal编程技术网

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

Python:为数据包头创建16位源端口和目标端口,python,sockets,byte,port,sendto,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

我正在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个字节=发送的16位。以下是我尝试过的:

我打电话给以下人员并得到:

>>>mySock.sendto(655000, addr)
TypeError: must be string or buffer, not int
好的,让我们尝试使用字节

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

如果我按位输入或使用0x0000输入呢

>>>mySock.sendto(bytes(65000 | 0x0000), addr)
5
好吧,该死!我遇到的最接近的事情就是乱搞妖术和妖术。见下文

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

不应该是2个字节吗?我不知道这是怎么回事。此外,当数字小于16384时,我希望保留前面的0。因此,例如,如果端口号为255 0B00000000111111,我希望它保持为2字节数据结构0x00FF,而不是截断为0xFF或0B111111。

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

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

这是65000个无符号的短字符,按网络顺序big-endian

len'\xfde8'是3,因为那里有3个字符:'\xfd',e',8'你是我的朋友,是一个python向导。H是什么意思?十六进制?
>>> import struct
>>> struct.pack('!H', 65000)
'\xfd\xe8'