def ping(host, timeout=2, ping_id=None, udp=False):
"""Ping remote host.
:param str host: Host name/address.
:param float timeout: timeout.
:param int ping_id: 16 bit integer to identify packet.
"""
dest_addr = socket.gethostbyname(host)
icmp = socket.getprotobyname('icmp')
socket_type = socket.SOCK_DGRAM if udp else socket.SOCK_RAW
raw_socket = socket.socket(socket.AF_INET, socket_type, icmp)
ping_id = os.getpid() if ping_id is None else ping_id
ping_id &= 0xffff
seq_code = random.randint(1, 65535)
latency = None
start_ts = time.time()
end_ts = start_ts + timeout
send_ping(raw_socket, dest_addr, ping_id, seq_code)
while time.time() < end_ts:
r_ping_id, r_seq_code, r_recv_ts = receive_reply(raw_socket, timeout)
if ping_id == r_ping_id and r_seq_code == seq_code:
latency = r_recv_ts - start_ts
break
return latency
评论列表
文章目录