2010-03-26 4 views
4

У меня есть список сервер IP-адрес, мне нужно проверить, если каждому из них в Интернете, и как долго задержки есть.Измерения пинг латентности сервера - Python

Я не нашел прямых способов реализации этого, и, кажется, есть несколько проблем при вычислении латентности точно.


Любые идеи?

+1

У этого есть несколько полезных советов: http://stackoverflow.com/questions/316866/ping-a-site-in-python – Dan

+0

@ Dan: все они вызывают команды OS ... – RadiantHex

+0

На самом деле главный ответ на этот поток - это чистая реализация Python, которая, похоже, делает именно то, что вы хотите. – FogleBird

ответ

4

Если вы уже знакомы с разбором строками, вы можете использовать модуль подпроцесса, чтобы получить данные, которые вы ищете в строку, как это:

>>> import subprocess 
>>> p = subprocess.Popen(["ping.exe","www.google.com"], stdout = subprocess.PIPE) 
>>> print p.communicate()[0] 

Pinging www.l.google.com [209.85.225.99] with 32 bytes of data: 

Reply from 209.85.225.99: bytes=32 time=59ms TTL=52 
Reply from 209.85.225.99: bytes=32 time=64ms TTL=52 
Reply from 209.85.225.99: bytes=32 time=104ms TTL=52 
Reply from 209.85.225.99: bytes=32 time=64ms TTL=52 

Ping statistics for 209.85.225.99: 
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
    Minimum = 59ms, Maximum = 104ms, Average = 72ms 
+2

Это не очень хороший подход, поскольку он, очевидно, будет специфичным для платформы (но в этом нет необходимости). – Kat

5

Если вы хотите, чтобы избежать выполнения всех деталей сети связи, вероятно, можно попытаться построить что-то на вершине fping:

Fping это как программа, которая использует Internet Control Protocol Message (ICMP) эхо-запрос, чтобы определить, отвечает ли целевой хост . fping отличается от ping тем, что вы можете указать любое количество целей в командной строке или указать файл , содержащий списки целей до ping. Вместо отправки одной цели до тех пор, пока она не выйдет из ответа или не ответит, fping отправит из пакета ping и переместится на следующей целью в круговом режиме.

+2

Спасибо, хорошо работает. Кроме того, я хочу отметить, что «в отличие от ping, fping предназначен для использования в сценариях, поэтому его вывод предназначен для простого анализа». – Jabba

+0

ссылка не работает! – Peter

+0

Ссылка обновлена. – hlovdal

3

После предложения hlovdal к работе с Fping , вот мое решение, которое я использую для тестирования прокси. Я только пробовал это под Linux. Если время ping не может быть измерено, возвращается большое значение. Использование: print get_ping_time('<ip>:<port>').

import shlex 
from subprocess import Popen, PIPE, STDOUT 

def get_simple_cmd_output(cmd, stderr=STDOUT): 
    """ 
    Execute a simple external command and get its output. 
    """ 
    args = shlex.split(cmd) 
    return Popen(args, stdout=PIPE, stderr=stderr).communicate()[0] 

def get_ping_time(host): 
    host = host.split(':')[0] 
    cmd = "fping {host} -C 3 -q".format(host=host) 
    res = [float(x) for x in get_simple_cmd_output(cmd).strip().split(':')[-1].split() if x != '-'] 
    if len(res) > 0: 
     return sum(res)/len(res) 
    else: 
     return 999999 
+0

Я думаю, что 'process.' является опечаткой в ​​этом фрагменте – kaptan

+0

@kaptan: Спасибо, исправлено. – Jabba

1

https://github.com/matthieu-lapeyre/network-benchmarkMy решение, основанное на работе FlipperPA: https://github.com/FlipperPA/latency-tester

import numpy 
import pexpect 


class WifiLatencyBenchmark(object): 
    def __init__(self, ip): 
     object.__init__(self) 

     self.ip = ip 
     self.interval = 0.5 

     ping_command = 'ping -i ' + str(self.interval) + ' ' + self.ip 
     self.ping = pexpect.spawn(ping_command) 

     self.ping.timeout = 1200 
     self.ping.readline() # init 
     self.wifi_latency = [] 
     self.wifi_timeout = 0 

    def run_test(self, n_test): 
     for n in range(n_test): 
      p = self.ping.readline() 

      try: 
       ping_time = float(p[p.find('time=') + 5:p.find(' ms')]) 
       self.wifi_latency.append(ping_time) 
       print 'test:', n + 1, '/', n_test, ', ping latency :', ping_time, 'ms' 
      except: 
       self.wifi_timeout = self.wifi_timeout + 1 
       print 'timeout' 

     self.wifi_timeout = self.wifi_timeout/float(n_test) 
     self.wifi_latency = numpy.array(self.wifi_delay) 

    def get_results(self): 
     print 'mean latency', numpy.mean(self.wifi_latency), 'ms' 
     print 'std latency', numpy.std(self.wifi_latency), 'ms' 
     print 'timeout', self.wifi_timeout * 100, '%' 


if __name__ == '__main__': 
    ip = '192.168.0.1' 
    n_test = 100 

    my_wifi = WifiLatencyBenchmark(ip) 

    my_wifi.run_test(n_test) 
    my_wifi.get_results() 

Github репозиторий: https://github.com/matthieu-lapeyre/network-benchmark

+0

Обратите внимание, что pexpect является unix-only. –

0

спасибо от Джаббы, но этот код не работает для меня, так что я что-то изменить как указано ниже

import shlex 
from subprocess import Popen, PIPE, STDOUT 


def get_simple_cmd_output(cmd, stderr=STDOUT): 
    """ 
    Execute a simple external command and get its output. 
    """ 
    args = shlex.split(cmd) 
    return Popen(args, stdout=PIPE, stderr=stderr).communicate()[0] 


def get_ping_time(host): 
    host = host.split(':')[0] 
    cmd = "fping {host} -C 3 -q".format(host=host) 
    # result = str(get_simple_cmd_output(cmd)).replace('\\','').split(':')[-1].split() if x != '-'] 
    result = str(get_simple_cmd_output(cmd)).replace('\\', '').split(':')[-1].replace("n'", '').replace("-", 
                             '').replace(
     "b''", '').split() 
    res = [float(x) for x in result] 
    if len(res) > 0: 
     return sum(res)/len(res) 
    else: 
     return 999999 


def main(): 
    # sample hard code for test 
    host = 'google.com' 
    print([host, get_ping_time(host)]) 

    host = 'besparapp.com' 
    print([host, get_ping_time(host)]) 



if __name__ == '__main__': 
    main() 
Смежные вопросы