使用C ++,我想使用命令/类来获取ping主机以在我的程序中使用的延迟时间。我尝试使用ping命令,但由于其中包含其他统计信息,因此没有简单的方法来收集时间。我希望有一个更简单的方法。
答案 0 :(得分:7)
ping工具通常在C中实现,并通过在ICMP上发送Echo request raw socket个数据包来工作。记录系统时间 - 通常在gettimeofday下posix - 当发出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。