Skip to content

Commit 38e5d11

Browse files
committed
ping
1 parent 6180a4f commit 38e5d11

1 file changed

Lines changed: 39 additions & 0 deletions

File tree

useful_scripts/ping.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Example run:
2+
# ~/Desktop >sudo python3 ping.py
3+
# 0.017251014709472656
4+
5+
# Original source: https://gist.github.com/pyos/10980172
6+
7+
import time
8+
import random
9+
import select
10+
import socket
11+
12+
13+
def chk(data):
14+
x = sum(a + b * 256 for a, b in zip(data[::2], data[1::2] + b'\x00')) & 0xFFFFFFFF
15+
x = (x >> 16) + (x & 0xFFFF)
16+
x = (x >> 16) + (x & 0xFFFF)
17+
return (~x & 0xFFFF).to_bytes(2, 'little')
18+
19+
20+
def ping(addr, timeout=1):
21+
with socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) as conn:
22+
payload = random.randrange(0, 65536).to_bytes(2, 'big') + b'\x01\x00'
23+
packet = b'\x08\x00' + b'\x00\x00' + payload
24+
packet = b'\x08\x00' + chk(packet) + payload
25+
conn.connect((addr, 80))
26+
conn.sendall(packet)
27+
28+
start = time.time()
29+
30+
while select.select([conn], [], [], max(0, start + timeout - time.time()))[0]:
31+
packet = conn.recv(1024)[20:]
32+
unchecked = packet[:2] + b'\0\0' + packet[4:]
33+
34+
if packet == b'\0\0' + chk(unchecked) + payload:
35+
return time.time() - start
36+
37+
38+
if __name__ == '__main__':
39+
print(ping('google.com'))

0 commit comments

Comments
 (0)