You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:解析Python Socket地址信息输出各字段含义

解析PF_PACKET套接字recvfrom返回的地址元组

嘿,刚好对PF_PACKET类型的原始套接字返回格式门儿清,来帮你逐个拆解你拿到的输出('ens33', 2048, 1, 1, 'HE \xfd\x12h'):

  • ens33:这个你已经摸透了,就是捕获到数据包的网络接口名称,没啥疑问。
  • 2048:别误会,这不是缓冲区大小!它是**以太网帧类型(EtherType)**的十进制值,0x0800转十进制就是2048,对应IPv4协议——刚好你创建套接字时指定了socket.htons(0x0800),所以只会捕获IPv4帧,这个值就固定是2048啦。
  • 第一个1(有时为0):这是数据包的接收类型标识,对应Linux内核的packet_type枚举值:
    • 0(PACKET_HOST):数据包是直接发给本机的单播包
    • 1(PACKET_BROADCAST):广播数据包
    • 2(PACKET_MULTICAST):多播数据包
    • 3(PACKET_OTHERHOST):发往其他主机但被本机捕获的(比如开了混杂模式)
      所以你看到的1说明这是个广播包,换成0就是本机接收的单播包啦。
  • 第二个1(lo接口对应772):这个是网络接口的唯一索引(ifindex),系统里每个网卡都有专属的数字标识。你可以用ip link show ens33命令验证,就能看到ens33的索引是不是1;同理ip link show lo会显示你系统里lo的索引是772,不同系统的接口索引可能不一样哦。
  • 'HE \xfd\x12h':这是链路层的源MAC地址,不过是二进制字节串格式。直接打印会把可打印的ASCII字符显示出来,不可打印的就会变成转义序列。你可以把它转成标准的MAC地址格式,比如用这段代码:
    import binascii
    mac_raw = b'HE \xfd\x12h'
    mac_hex = binascii.hexlify(mac_raw).decode('utf-8')
    mac_formatted = ':'.join([mac_hex[i:i+2] for i in range(0, 12, 2)])
    print(mac_formatted)  # 输出 48:45:20:fd:12:68
    

内容的提问来源于stack exchange,提问作者trogne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:03:47