import socket import time
def ping(host, count=5): try:
创建发送socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW)
# 绑定本地接口
s.bind((socket.gethostbyname(host), 0))
# 设置超时
s.settimeout(1)
# 组建ICMP Echo请求包
icmp_header = bytearray(b'\x08\x00')
data = b'hello'
packet = icmp_header + data
# 发送包并接收响应
delays = []
for _ in range(count):
s.sendto(packet, (host, 0))
# 等待响应
start_time = time.time()
try:
response, addr = s.recvfrom(1024)
except socket.timeout:
# 超时,表示没有响应
break
end_time = time.time()
# 计算延迟
delay = end_time - start_time
delays.append(delay)
print(f"Round trip: {delay:.2f}ms")
# 计算平均延迟
if delays:
average = sum(delays) / count
print(f"Average: {average:.2f}ms")
else:
print("No responses received")
except Exception as e:
print(f"Error: {str(e)}")
finally:
s.close()
if name == "main": import sys host = sys.argv[1] ping(host)
### 代码解释:
1. **导入必要的模块**:`socket`用于网络通信,`time`用于记录时间计算延迟。
2. **定义函数`ping(host, count=5)`**:用于测试目标主机的网络延迟,`count`指定发送次数,默认为5次。
3. **创建并配置socket**:
- 使用`socket.socket()`创建一个RAW socket,指定使用IPv4。
- 使用`bind()`方法将socket绑定到目标主机的本地IP地址和任意端口()。
- 使用`settimeout(1)`设置接收超时为1秒。
4. **构建ICMP Echo请求包**:
- ICMP Echo请求包的类型为8(x08),构造头部和数据部分。
- 数据部分设置为`b'hello'`。
5. **发送和接收包**:
- 循环发送指定次数的Echo请求包。
- 使用`recvfrom()`接收响应,捕获超时异常。
- 记录每次响应的延迟时间,计算并打印每次延迟。
6. **计算平均延迟**:
- 将所有延迟值累加,计算平均值并打印。
7. **错误处理**:
- 使用`try-except`块捕获异常,确保资源被正确释放。
8. **主函数**:
- 从命令行参数获取目标主机地址。
- 调用`ping()`函数进行测试。
这个工具可以帮助用户测试网络连接的延迟,适用于内部网络调试或基础网络性能测试。








