python 原始套接字 ping
时间: 2023-09-02 07:11:47 浏览: 61
可以使用 Python 的原始套接字(raw sockets)对目标主机进行 ping 测试。具体实现可以使用 Python 内置的 socket 模块进行操作。以下是一个简单的示例代码:
```python
import socket
import struct
import time
def ping(host):
# 构造 ICMP 报文
seq_num = 1
icmp_type = 8 # ping 请求
icmp_code = 0
icmp_checksum = 0
icmp_id = socket.getpid() & 0xFFFF # 可以自定义
# 构造 ICMP 报文
packet = struct.pack("!BBHHH", icmp_type, icmp_code, icmp_checksum, icmp_id, seq_num)
cksum = calculate_checksum(packet)
# 重新计算校验和
packet = struct.pack("!BBHHH", icmp_type, icmp_code, cksum, icmp_id, seq_num)
# 建立原始套接字并发送 ICMP 报文
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
sock.sendto(packet, (host, 0))
# 接收并解析响应报文
sock.settimeout(5.0)
try:
data, addr = sock.recvfrom(1024)
icmp_type, icmp_code, icmp_checksum, icmp_id, icmp_seq = struct.unpack("!BBHHH", data[20:28])
return True
except socket.timeout:
return False
finally:
sock.close()
def calculate_checksum(data):
n = len(data) % 2
sum = 0
for i in range(0, len(data)-n, 2):
sum += (data[i] << 8) + data[i+1]
if n:
sum += (data[-1] << 8)
sum = (sum >> 16) + (sum & 0xffff)
sum += (sum >> 16)
return ~sum & 0xffff
if __name__ == "__main__":
host = "www.google.com" # 目标主机
if ping(host):
print(f"{host} is reachable")
else:
print(f"{host} is unreachable")
```
注意,在 Windows 平台下,原始套接字需要以管理员权限运行 Python 解释器。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)