python

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()`函数进行测试。
这个工具可以帮助用户测试网络连接的延迟,适用于内部网络调试或基础网络性能测试。

python

扫码添加AstrillVPN官网微信

扫码添加AstrillVPN官网微信

029-8826-4715
扫码添加AstrillVPN官网微信

扫码添加AstrillVPN官网微信

网站地图