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
相关产品推荐
相关产品推荐

