gpt4 book ai didi

c++ - 如何计算 ICMP 数据包的往返时间

转载 作者:行者123 更新时间:2023-11-28 07:16:26 27 4
gpt4 key购买 nike

我正在 Qt5 中编写一些 C 代码来发送 ICMP 回显数据包来检测机器。我不知道如何计算往返时间。

我的代码似乎无法正常工作:

Before sending:
struct timezone tz;
struct timeval ts;
gettimeofday( &ts, &tz );
ts.tv_sec = ts.tv_sec;
ts.tv_usec = ts.tv_usec;
bcopy(&ts, &(pkt.icmp.data[0]), sizeof(struct timeval)); // target host will modify this
bcopy(&ts, &(pkt.icmp.data[8]), sizeof(struct timeval));

After receiving:
struct timezone tz;
struct timeval ts1;
struct timeval ts2;

bcopy(&(pkt.icmp.data[8]), &ts1, sizeof(struct timeval));
gettimeofday( &ts2, &tz );
round trip time = (ts2.tv_sec - ts1.tv_sec) +
1e-6 * (ts2.tv_usec - ts1.tv_usec);

有什么问题吗?

谢谢

编辑:这是接收函数:

void CPingReceiver::dataProcess(struct icmp_packet pkt)
{
struct timezone tz;
struct timeval ts1;
struct timeval ts2;

bcopy(&(pkt.icmp.data[8]), &ts1, sizeof(struct timeval));
gettimeofday( &ts2, &tz );

QHostAddress ha = QHostAddress(ntohl(pkt.ip.saddr));
foundItem.first = ha.toString();// (ts2.tv_sec * 1000 + ts2.tv_usec / 1000) - (ts1.tv_sec * 1000 + ts1.tv_usec / 1000)
foundItem.second = tr("%1 ms").arg(((ts2.tv_sec - ts1.tv_sec) +
(ts2.tv_usec - ts1.tv_usec) / 1000000));

emit sendToListener(foundItem);

// qDebug() << addr << endl;

// now send the data to ARP Worker Singleton
// PING results will send its data to ARP Worker Singleton as well
// same for hostname, vendor and netbios, open ports
}

这里是发送函数:

/************************************************************************
* Build ICMP Header
************************************************************************/
pkt.icmp.type = ICMP_ECHO; // icmp echo */
pkt.icmp.code = 0; // only valid value for echo or echo reply */
pkt.icmp.checksum = 0;
pkt.icmp.identifier = ICMP_IDENTIFIER; // the id we'll be using to distinguish our data from other icmp packets */
pkt.icmp.sequence = 1; // Start from 0
struct timezone tz;
struct timeval ts;
gettimeofday( &ts, &tz );
bzero(pkt.icmp.data, ICMP_MTU);
bcopy(&ts, &(pkt.icmp.data[0]), sizeof(struct timeval));
bcopy(&ts, &(pkt.icmp.data[8]), sizeof(struct timeval));

pkt.icmp.checksum = calcsum((quint16 *)(&pkt.icmp), sizeof(pkt.icmp));

这是我得到的:

"192.168.0.21" "----" "F0:7D:68:04:49:86"  // ARP reply
"192.168.0.28" "----" "00:19:5B:0D:30:85" // ARP reply
"192.168.0.30" "----" "00:04:20:2C:83:34" // ARP reply
"-------------PING reply-----------------" "192.168.0.21" "----" "-8316290828429 ms"
"192.168.0.26" "----" "74:44:01:D3:07:E0" // ARP reply
"-------------PING reply---------------" "192.168.0.26" "----" "-8316290828429 ms"
"-------------PING reply---------------" "192.168.0.30" "----" "-8316290828429 ms"
"192.168.0.23" "----" "C8:60:00:1A:B0:BC" // ARP reply
"-------------PING reply---------------" "192.168.0.23" "----" "-8316290828429 ms"

最佳答案

gettimeofday() 函数以 native 字节顺序提供时间值,不一定以网络字节顺序。不要不要调用ntohl()

double round_trip_time = (ts2.tv_sec - ts1.tv_sec) +
1e-6 * (ts2.tv_usec - ts1.tv_usec);

关于c++ - 如何计算 ICMP 数据包的往返时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20169700/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com