gpt4 book ai didi

Python 原始套接字不接收 ICMP 数据包

转载 作者:行者123 更新时间:2023-11-28 19:25:43 32 4
gpt4 key购买 nike

我正在尝试使用 Python 中的原始套接字将 UDP 数据包发送到主机,然后获取数据包的 ICMP 响应——基本上是重新实现 traceroute。

我已经设法正确构建了我的 IP 和 UDP header 并发送了数据包。我可以在 Wireshark 中看到它。我还在 Wireshark 中看到 ICMP 响应告诉我超过了 TTL。

我有以下代码:

me = gethostbyname(gethostname())
my_socket = socket(AF_INET, SOCK_RAW)
my_socket.setsockopt(IPPROTO_IP, IP_HDRINCL, 1)
my_socket.bind((me, 0))

hostname = 'www.google.com'
hostip = gethostbyname(hostname)

packet = create_packet(hostname)
send_socket.sendto(packet, (hostip , 0))

然后在发送数据包后,我调用另一个函数来监听传入的数据包,其中包括以下代码段:

while True:
ready = select.select([my_socket], [], [], time_left)
if ready[0] == []:
print "timeout"
time_now = time.time()
rec_packet, addr = my_socket.recvfrom(5120)

unpacked_ip = unpack('!BBHHHBBH4s4s', rec_packet[0:20]) #0-20 is IP header
prot = unpacked_ip[6] #gives the protocol id
if prot == 1:
#this is ICMP , let's do things

我能够成功解压 IP header 并检查协议(protocol),但它始终是 6 或 17(TCP 或 UDP)。我从来没有得到包含 ICMP 负载的 IP 数据包,即使它出现在 Wireshark 中也是如此。

我尝试将 Wireshark 中的 ICMP 数据包与我的程序确实看到的 Wireshark 中的其他数据包进行比较,IP header 几乎相同。我不知道出了什么问题。

感谢帮助

最佳答案

this answer 来看,您似乎需要在创建套接字时传递 IPPROTO_ICMP 选项。

你可以这样做:

my_socket = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_ICMP)

关于Python 原始套接字不接收 ICMP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13595614/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com