Измерение задержки пинга сервера - Python - PullRequest
5 голосов
/ 26 марта 2010

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

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


Есть идеи?

Ответы [ 5 ]

5 голосов
/ 26 марта 2010

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

>>> 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
4 голосов
/ 26 марта 2010

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

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

3 голосов
/ 27 декабря 2012

Следуя предложению hlovdal для работы с fping , вот мое решение, которое я использую для тестирования прокси. Я только попробовал это под Linux. Если время пинга не может быть измерено, возвращается большое значение. Использование: 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
1 голос
/ 27 января 2015

https://github.com/matthieu-lapeyre/network-benchmark Мое решение, основанное на работе 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 голосов
/ 19 февраля 2018

спасибо от Jabba, но этот код не работает правильно для меня, поэтому я изменяю что-то вроде следующего:

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