我想了解python套接字地址信息输出的含义。
import socket
rawSocket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
pkt = rawSocket.recvfrom(2048)
print pkt[1]
('ens33', 2048, 1, 1, 'HE \xfd\x12h')
ens33是发送数据的界面。
我猜2048是缓冲区大小。
我不知道第一个" 1"是。有时它" 0"。
我注意到第二个" 1"涉及界面(即" 772" for" lo")
' HE \ xfd \ x12h' :还原转换后的十六进制值,我们得到' \ x48 \ x45 \ x20 \ xfd \ x12 \ x68',它在VM桥接连接中给出主机的mac地址。
所以,主要问题是#3。这里1或0是什么意思?
答案 0 :(得分:2)
简而言之,第三个1
表示它是一个广播数据包。 0
意味着它是一个发往运行Python代码的机器的数据包。详情如下。
这是基于Python 3.6,但对于其他Py2或Py3版本,答案应该类似。答案分为source for the socket module,packet(7) man page和the Linux source。
Python库包含函数makesockaddr()
。对于PF_PACKET
套接字(与AF_PACKET
相同),relevant portion为您提供以下字段顺序。 man page的解释用斜体表示。
ifname
(例如,ens33
)(接口名称,如您所述)sll_protocol
(例如2048
)物理层协议 sll_pkttype
(例如1
)数据包类型 sll_hatype
(例如1
) ARP硬件类型 sll_addr
(例如,MAC地址,如上所述)物理层地址 Linux源代码为packet type提供了各种值。在该列表中,1
为PACKET_BROADCAST
。 0
为PACKET_HOST
,解释为“给我们”。