Получить задержку от хоста в C ++ - PullRequest
2 голосов
/ 26 января 2009

Используя C ++, я хотел бы использовать команду / класс, чтобы получить время задержки при пинге хоста для использования в моей программе. Я попытался использовать команду ping, но не было простого способа собрать время, поскольку оно включено в другую статистическую информацию. Я надеялся на более легкий подход.

Ответы [ 2 ]

7 голосов
/ 26 января 2009

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

В противном случае извлечение информации из системного вызова ping, вероятно, будет проще, чем вы думаете. Ключ должен открыть трубу , чтобы разрешить чтение стандартного вывода команды ping (см. popen или _popen). Регулярное выражение (например, "time = ([0-9] *)") можно использовать для извлечения желаемых данных. Если у вас нет доступной библиотеки регулярных выражений, то извлечение этих данных требует лишь тривиальных манипуляций со строками. Класс STL предоставляет несколько алгоритмов, которые могут быть полезны.

0 голосов
/ 26 января 2009

если вам не нравятся регулярные выражения, вы всегда можете перебрать выходные данные, ища t, затем i, затем m, затем e и =, просто пошагово просматривая выходную строку по одной части за раз. сохранить указатель на символ после =, затем пройти дальше и заменить следующий пробел на ноль. теперь у вас есть строка с задержкой, преобразование в число можно выполнить с помощью существующих функций преобразования.

например. если выходные данные находятся в char * output с длиной, сохраненной в unsigned int length, и соответствующая строка должна быть в char * match ...

for(unsigned int i = 4; i < length; ++i)
{
  if(output[i] == '=')
  {
    if((output[i-4] = 't') && (output[i-3] = 'i') && (output[i-2] = 'm') && (output[i-1] = 'e'))
    {
      match = &(output[i+1]);
      while(output[i] != ' ') ++i;
      output[i] = 0;
      break;
    }
  }
}

регулярные выражения более приятны, хотя ... они делают ваш код более удобным и читабельным. хотя, если у вас нет библиотеки для них, быстрее будет просто реализовать ее следующим образом ...:)

...