Как рассчитать время приема-передачи для пакета ICMP

0

Я пишу код C в Qt5 для отправки эхо-пакета 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"
  • 0
    Вы можете использовать функцию timersub .
  • 0
    структура часового пояса tz; struct timeval ts1; struct timeval ts2; struct timeval ts3; bcopy (& (pkt.icmp.data [8]), & ts1, sizeof (struct timeval)); gettimeofday (& ts2, & tz); timersub (& ts2, & ts1, & ts3); QHostAddress ha = QHostAddress (ntohl (pkt.ip.saddr)); foundItem.first = ha.toString (); foundItem.second = tr ("% 1 мс"). arg (ts3.tv_usec); "192.168.0.30" "----" "-8316290828429423476 мс"
Показать ещё 2 комментария
Теги:
qt
icmp

2 ответа

1

Функция gettimeofday() предоставляет значение времени в собственном порядке байтов, не обязательно в сетевом порядке байтов. Не называйте ntohl().

double round_trip_time = (ts2.tv_sec - ts1.tv_sec) +
                         1e-6 * (ts2.tv_usec - ts1.tv_usec);
  • 0
    Спасибо! Я изменил это, но все еще не работает.
  • 0
    Откуда ты знаешь, что это не работает?
Показать ещё 4 комментария
0

Думали ли вы об использовании QElapsedTimer?

  • 0
    не будет работать для сетевого приложения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню