2013-11-24 4 views
0

Я пишу код C в Qt5 для отправки эхо-пакета ICMP для обнаружения машины. Я не знаю, как рассчитать время в оба конца.Как рассчитать время прохождения маршрута для 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); 

Что-нибудь случилось?

Благодаря

Edit: это функция приема:

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'] (http://linux.die.net/man/3/timercmp). –

+0

struct timezone 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 га = QHostAddress (ntohl (pkt.ip.saddr)); foundItem.first = ha.toString(); foundItem.second = Tr (» % 1 ms "). Arg (ts3.tv_usec);" 192.168.0.30 "" ---- "" -8316290828429423476 ms " – QtFan

+0

Почему вы не используете переменную' ts', которую вы заполнили, вместо сетевых данных ? –

ответ

1

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

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

Спасибо, я изменил его, но все еще не работает. – QtFan

+0

Откуда вы знаете, что он не работает? –

+0

I получил это: «192.168.0.21» «----» «-5.37912e + 17 ms» – QtFan

0

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

+0

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

Смежные вопросы