|
@@ -3,11 +3,26 @@
|
|
|
import socket
|
|
|
import select
|
|
|
import random
|
|
|
+import subprocess
|
|
|
+import re
|
|
|
|
|
|
import peerfinder_pb2 as pf
|
|
|
|
|
|
SERVER = ("::1", 9999)
|
|
|
|
|
|
+ping_regexp = re.compile(r"time=(.*) ms")
|
|
|
+NB_PINGS = 3
|
|
|
+
|
|
|
+def ping(target, nb_pings=NB_PINGS):
|
|
|
+ """Returns the list of latencies towards the given target"""
|
|
|
+ args = ["ping", "-n", "-c", str(nb_pings), str(target.address)]
|
|
|
+ try:
|
|
|
+ out = subprocess.check_output(args, shell=False)
|
|
|
+ except subprocess.CalledProcessError:
|
|
|
+ return []
|
|
|
+ data = out.decode("utf8").split("\n")
|
|
|
+ data = [ping_regexp.search(line) for line in data]
|
|
|
+ return [float(m.group(1)) for m in data if m != None]
|
|
|
|
|
|
def test_socket():
|
|
|
s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
|
|
@@ -25,7 +40,14 @@ def test_socket():
|
|
|
print("Got pong")
|
|
|
else:
|
|
|
target = msg.target
|
|
|
- print(target)
|
|
|
+ latencies = ping(target.target)
|
|
|
+ reply = pf.Message()
|
|
|
+ reply.type = pf.Message.Measurement
|
|
|
+ reply.measurement.target_id = msg.target.target_id
|
|
|
+ reply.measurement.probes_sent = NB_PINGS
|
|
|
+ reply.measurement.probes_received = len(latencies)
|
|
|
+ reply.measurement.latency_us.extend([int(1000 * l) for l in latencies])
|
|
|
+ s.send(reply.SerializeToString())
|
|
|
except socket.timeout:
|
|
|
print("Sending heartbeat")
|
|
|
msg = pf.Message()
|