Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.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
Python2.7套接字_Python_Sockets - Fatal编程技术网

Python2.7套接字

Python2.7套接字,python,sockets,Python,Sockets,我目前正在研究python中的socket编程,我在socket.htons()中遇到了一些奇怪的行为。。。它似乎在每次调用时都在翻转字节 我正在实现一个简单的ping脚本,据我所知,网络字节顺序是big-endian,系统字节顺序是little-endian 如果我在16位校验和上使用htons,wireshark会报告它是不正确的,但是如果我只是将校验和打包到结构中而不使用htons,wireshark会确认它是正确的 这就是wireshark在使用HTON时捕获的内容 Checksum:

我目前正在研究python中的socket编程,我在socket.htons()中遇到了一些奇怪的行为。。。它似乎在每次调用时都在翻转字节

我正在实现一个简单的ping脚本,据我所知,网络字节顺序是big-endian,系统字节顺序是little-endian

如果我在16位校验和上使用htons,wireshark会报告它是不正确的,但是如果我只是将校验和打包到结构中而不使用htons,wireshark会确认它是正确的

这就是wireshark在使用HTON时捕获的内容

Checksum: 0xece4 [incorrect, should be 0xe4ec]
这里有一个简单的例子

>>> z = 0xFF00
>>> print z
65280
>>> z = socket.htons(z)
>>> print z
255
>>> z = socket.htons(z)
>>> print z
65280
对此有任何想法都将不胜感激,希望这只是我做错了什么

编辑:


一切看起来都正常运转。即使在您的示例中,也会交换2个字节,然后再交换回来。如果系统字节顺序与网络相同,那么它是不可操作的,但是您的问题指出网络字节顺序较大,而主机较小,因此应该进行交换

In [1]: a = 0xECE4
In [2]: b = 0xE4EC

In [3]: a
Out[3]: 60644

In [4]: b
Out[4]: 58604

In [5]: socket.htons(a)
Out[5]: 58604

In [6]: socket.htons(b)
Out[6]: 60644

In [7]: socket.htons(a) == b
Out[7]: True

In [8]: socket.htons(b) == a
Out[8]: True

In [9]: hex(socket.htons(a))
Out[9]: '0xe4ec'

In [10]: hex(socket.htons(b))
Out[10]: '0xece4'

In [11]: bin(socket.htons(a))
Out[11]: '0b1110010011101100'

In [12]: bin(socket.htons(b))
Out[12]: '0b1110110011100100'

从python中:

socket.htons(x)

将16位正整数从主机转换为网络 字节顺序。在主机字节顺序与相同的计算机上 网络字节顺序,这是一个无操作;否则,它将执行2字节的 交换操作


您是否可以包含:
print sys.byteorder
的输出,以便再次检查尾端?您的示例没有任何错误。每次调用
htons()
都将翻转传递给它的参数字节。毕竟,它是无状态的,数据本身并没有说“我是big-endian”或“我是little-endian”。我认为这个例子有点粗略。在HTON的文档中,它说。。“在主机字节顺序与网络字节顺序相同的机器上,这是不可操作的”;因此,无论我的系统的字节顺序如何,对htons的调用都应始终为我提供正确字节顺序的校验和?谢谢,这消除了我对htons工作原理的误解。这表明问题实际上在我的校验码中。谢谢=]@DarkRyuu:总是先检查代码。不要假设第三方代码有bug,尤其是当它涉及到经过良好测试的系统库时。
In [1]: a = 0xECE4
In [2]: b = 0xE4EC

In [3]: a
Out[3]: 60644

In [4]: b
Out[4]: 58604

In [5]: socket.htons(a)
Out[5]: 58604

In [6]: socket.htons(b)
Out[6]: 60644

In [7]: socket.htons(a) == b
Out[7]: True

In [8]: socket.htons(b) == a
Out[8]: True

In [9]: hex(socket.htons(a))
Out[9]: '0xe4ec'

In [10]: hex(socket.htons(b))
Out[10]: '0xece4'

In [11]: bin(socket.htons(a))
Out[11]: '0b1110010011101100'

In [12]: bin(socket.htons(b))
Out[12]: '0b1110110011100100'