2

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

4

3 回答 3

7

ping工具通常在 C 中实现,通过在原始套接字上发送ICMP Echo请求 数据包来工作。当发出 Echo 请求并再次收到Echo 回复(如果有)以确定往返时间时,系统时间被记录 - 通常在posix下使用gettimeofday 。您可以使用sockets在您的 C++ 应用程序中放置相同的功能。

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

于 2009-01-26T14:56:15.413 回答
0

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

例如,如果输出是 char* 输出,长度存储在 unsigned int 长度中,并且匹配的字符串需要进入 char* 匹配...

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;
    }
  }
}

正则表达式虽然更好......它们使您的代码看起来更潮和可读。虽然如果你没有他们的图书馆,那么像这样实现它会更快...... :)

于 2009-01-26T15:57:29.907 回答
0

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

于 2020-05-06T07:06:49.170 回答