在C ++中从主机获取延迟

时间:2009-01-26 14:19:57

标签: c++ latency ping

使用C ++,我想使用命令/类来获取ping主机以在我的程序中使用的延迟时间。我尝试使用ping命令,但由于其中包含其他统计信息,因此没有简单的方法来收集时间。我希望有一个更简单的方法。

3 个答案:

答案 0 :(得分:7)

ping工具通常在C中实现,并通过在ICMP上发送Echo request raw socket个数据包来工作。记录系统时间 - 通常在gettimeofdayposix - 当发出Echo请求时,再次收到Echo reply(如果有)以确定往返时时间。您可以使用sockets在C ++应用程序中添加相同的功能。

否则,从ping系统调用中提取信息可能比您想象的更容易。关键是打开pipe以允许读取ping命令的standard output(请参阅popen_popen)。可以使用regular expression(例如“time =([0-9] *)”)来获取所需数据。如果您没有可用的正则表达式库,那么提取此数据只需要相当简单的字符串操作。 STL string class提供了几种可能有用的算法。

答案 1 :(得分:0)

如果你不喜欢正则表达式,你总是可以遍历输出,查找t后跟i后跟m,接着是e,然后是=,只需逐步单步输出一个输出字符串。在=之后存储指向char的指针,然后逐步执行并用零替换下一个空格。你现在有一个带有延迟的字符串,可以使用现有的转换函数转换为数字。

e.g。如果输出是char *输出,长度存储在unsigned int长度,匹配的字符串需要进入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;
    }
  }
}

正则表达式更好但是......它们使你的代码看起来很多,并且可读。虽然如果你没有他们的库,那么实现它会更快......:)

答案 2 :(得分:0)

如果使用Windows,则可以使用win32 api函数https://docs.microsoft.com/en-us/windows/win32/api/icmpapi/nf-icmpapi-icmpsendecho2