编写程序,实现 ping 命令的部分功能。根据命令行输入的域名或 IP 地址,ping 对方主机,返回 ping 的时间并显示。如果 ping 不到对方主机 则显示超时。
时间: 2024-10-12 07:05:05 浏览: 26
编写一个简单的 Ping 命令模拟程序,可以利用 Python 的 socket 和 time 模块。下面是一个基本的示例:
```python
import socket
import sys
import time
def ping(host):
# 创建一个socket对象
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
try:
# 发送 ICMP ECHO_REQUEST 包
request = ("GET / HTTP/1.0\r\n" +
"Host: %s\r\n" % host + "\r\n").encode()
sent_time = time.time()
sock.sendto(request, (host, 80)) # 使用端口80作为通用示例(实际应使用ICMP)
# 接收响应数据
response, addr = sock.recvfrom(65536) # 假设最大接收包大小为64KB
received_time = time.time()
# 计算往返时间并打印结果
if response:
rtt = received_time - sent_time
print(f"Ping to {host} took {rtt*1000:.2f} ms")
else:
print(f"Ping to {host} timed out")
except socket.gaierror as e:
print(f"Invalid hostname: {e}")
except Exception as e:
print(f"Error pinging {host}: {e}")
if __name__ == "__main__":
# 获取用户输入的主机名或IP地址
target = sys.argv[1] if len(sys.argv) > 1 else input("Enter a domain or IP address: ")
ping(target)
```
在这个示例中,我们创建了一个 TCP/IP socket,并尝试向目标发送一个 HTTP 请求,实际上这并不是真正的 ping。因为 ping 使用的是 ICMP 协议,所以需要使用 `socket.SOCK_RAW` 和 `socket.IPPROTO_ICMP`。在实际应用中,你需要替换发送请求的部分以使用 ICMP。
阅读全文