Browse Source

Implement ping

Baptiste Jonglez 10 years ago
parent
commit
4b710c7dc4
1 changed files with 23 additions and 1 deletions
  1. 23 1
      peerfinderv2/client.py

+ 23 - 1
peerfinderv2/client.py

@@ -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()