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

Python中接收ICMP错误需设置哪个Socket选项?

解决ICMP原始套接字接收错误报文的问题

你创建的SOCK_RAW类型ICMP套接字,默认已经具备接收ICMP错误报文(比如超时、目标不可达等)的能力,但如果遇到无法接收的情况,需要调整以下套接字选项:

1. 开启IP_RECVERR选项(Linux系统)

该选项允许套接字接收异步错误信息,对原始套接字接收ICMP错误报文有帮助,设置方式如下:

import socket

tracesocket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname('icmp'))
# 开启IP_RECVERR选项
tracesocket.setsockopt(socket.IPPROTO_IP, socket.IP_RECVERR, 1)

2. 直接读取并解析报文(通用)

原始ICMP套接字默认不会过滤ICMP错误类型报文,你可以直接通过recvfrom()方法读取报文,再解析ICMP头部判断是否为错误报文:

while True:
    packet, addr = tracesocket.recvfrom(1024)
    # 解析ICMP头部:前20字节为IP头,后续是ICMP头
    icmp_header = packet[20:28]
    icmp_type = icmp_header[0]
    # ICMP类型11代表超时,类型3代表目标不可达,均为错误报文
    if icmp_type in (3, 11):
        print(f"收到ICMP错误报文:来自{addr},类型{icmp_type}")

3. Windows系统注意事项

如果在Windows环境运行:

  • 必须以管理员权限启动程序
  • 无需额外设置套接字选项,默认即可接收ICMP错误报文,只需确保IP头和ICMP头的解析逻辑正确

另外需要注意:使用SOCK_RAW套接字通常需要管理员/root权限,否则会抛出权限错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 05:23:12