URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9114
[ Назад ]

Исходное сообщение
"Что за тип n_time?"

Отправлено goodfornothing , 04-Май-11 22:00 
Еще раз здравствуйте!!!

Возникла необходимость в использовании функции libnet_build_icmpv4_timestamp из библиотеки libnet. Вот ее прототип:

libnet_build_icmpv4_timestamp     (     u_int8_t      type,
        u_int8_t      code,
        u_int16_t      sum,
        u_int16_t      id,
        u_int16_t      seq,
        n_time      otime,
        n_time      rtime,
        n_time      ttime,
        u_int8_t *      payload,
        u_int32_t      payload_s,
        libnet_t *      l,
        libnet_ptag_t      ptag    
    )     

Ни как не могу понять, что за тип такой n_time??? Искал где только мог, но ничего про него не нашел. Из описания протокола видно, что под временную метку отводится 4 байта. При помощи какой функции можно получить метку системного времени для отправки ее в icmp сообщении данного типа?

Заранее спасибо!


Содержание

Сообщения в этом обсуждении
"Что за тип n_time?"
Отправлено guest , 05-Май-11 10:15 
> Ни как не могу понять, что за тип такой n_time??? Искал где
> только мог, но ничего про него не нашел. Из описания протокола
> видно, что под временную метку отводится 4 байта. При помощи какой
> функции можно получить метку системного времени для отправки ее в icmp
> сообщении данного типа?

Плохо искали)
это UTC время в миллисекундах от начала суток в сетевом порядке, соответственно:
n_time
getntime(void)
{
        struct timespec ts;
        u_long t;

        clock_gettime(CLOCK_REALTIME, &ts);
        t = (ts.tv_sec % (24*60*60)) * 1000 + ts.tv_nsec / 1000000;
        return (htonl(t));
}


"Что за тип n_time?"
Отправлено goodfornothing , 05-Май-11 22:17 
Искал я может и плохо, но в google нет ничего по запросу n_time. Как там еще искать, я уж не знаю)

За разъяснение спасибо, только вот не совсем ясен смысл следующих действий:

(ts.tv_sec % (24*60*60)) * 1000 + ts.tv_nsec / 1000000

Если первое поле структуры содержит в себе число секунд, а второе - наносекунд, то напрашивается следующий вариант:

ts.tv_sec * 1000 + ts.tv_nsec * 1000000

Не могли бы Вы разъяснить данный момент?


"Что за тип n_time?"
Отправлено Andrey Mitrofanov , 05-Май-11 23:04 
> (ts.tv_sec % (24*60*60)) * 1000 + ts.tv_nsec / 1000000
> ts.tv_sec * 1000 + ts.tv_nsec * 1000000
> Не могли бы Вы разъяснить данный момент?

Можно я, спасибо: "от начала суток".


"Что за тип n_time?"
Отправлено goodfornothing , 05-Май-11 23:13 
Все, понял. Спаибо



"Что за тип n_time?"
Отправлено pavlinux , 08-Май-11 03:34 
>[оверквотинг удален]
>   n_time   otime,
>   n_time   rtime,
>   n_time   ttime,
>   u_int8_t *   payload,
>   u_int32_t   payload_s,
>   libnet_t *   l,
>   libnet_ptag_t   ptag
>  )
> Ни как не могу понять, что за тип такой n_time??? Искал где
> только мог, но ничего про него не нашел.

# grep " n_time" /usr/include/ -R
/usr/include/netinet/in_systm.h:typedef u_int32_t n_time;       /* ms since 00:00 GMT, byte rev   */



#ifndef _NETINET_IN_SYSTM_H
#define _NETINET_IN_SYSTM_H 1

#include <sys/cdefs.h>
#include <sys/types.h>

__BEGIN_DECLS

/*
* Network order versions of various data types. Unfortunately, BSD
* assumes specific sizes for shorts (16 bit) and longs (32 bit) which
* don't hold in general. As a consequence, the network order versions
* may not reflect the actual size of the native data types.
*/

typedef u_int16_t n_short;      /* short as received from the net */
typedef u_int32_t n_long;       /* long as received from the net  */
typedef u_int32_t n_time;       /* ms since 00:00 GMT, byte rev   */

__END_DECLS

#endif /* netinet/in_systm.h */


"Что за тип n_time?"
Отправлено goodfornothing , 09-Май-11 11:13 
Большое спасибо, pavlinux! Как всегда, в точку!)