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

Исходное сообщение
"пример из книги Стивенса 'UNIX network programmin, 2nd ed.'"

Отправлено cruzo , 20-Сен-06 07:34 
Всем привет.

Разбираюсь с примером из главы Raw sockets. Реализация команды ping (стр. 668 англоязычного издания). Никак не могу сообразить как конвертируются микросекунды в милисекунды, IMHO в книге ошибка:

...
tvsend = (struct timeval *) icmp->icmp_data;
tv_sub(tvrecv, tvsend);
rtt = tvrecv->tv_sec * 1000.0 + tvrecv->tv_usec / 1000.0;
...

Но ведь милисекунды это 10^-3, соответственно должно быть так:

rtt = tvrecv->tv_sec / 1000.0 + tvrecv->tv_usec * 1000.0;

Поправьте меня, либо я не замечаю очевидного?

Спасибо.


Содержание

Сообщения в этом обсуждении
"пример из книги Стивенса 'UNIX network programmin, 2nd ed.'"
Отправлено Boris Polevoy , 20-Сен-06 10:29 
>Всем привет.
>
>Разбираюсь с примером из главы Raw sockets. Реализация команды ping (стр. 668
>англоязычного издания). Никак не могу сообразить как конвертируются микросекунды в милисекунды,
>IMHO в книге ошибка:
>
>...
>tvsend = (struct timeval *) icmp->icmp_data;
>tv_sub(tvrecv, tvsend);
>rtt = tvrecv->tv_sec * 1000.0 + tvrecv->tv_usec / 1000.0;
>...
>
>Но ведь милисекунды это 10^-3, соответственно должно быть так:
>
>rtt = tvrecv->tv_sec / 1000.0 + tvrecv->tv_usec * 1000.0;
>
>Поправьте меня, либо я не замечаю очевидного?
>
>Спасибо.

struct timeval {
        long            tv_sec;         /* seconds (XXX should be time_t) */
        suseconds_t     tv_usec;        /* and microseconds */
};

tv_usec - это микросекунды, 10^-6 соответсвенно, делятся на 1000 (10^3), чтобы получить значение миллисекунд.
То же самое в отношении структуры timespec, там наносекунды, делятся на 1000000 для отображения миллисекунд.



"пример из книги Стивенса 'UNIX network programmin, 2nd ed.'"
Отправлено анатолий , 20-Сен-06 10:37 
>
>struct timeval {
>        long    
>        tv_sec;  
>      /* seconds (XXX should be
>time_t) */
>        suseconds_t    
> tv_usec;        /* and
>microseconds */
>};
>
>tv_usec - это микросекунды, 10^-6 соответсвенно, делятся на 1000 (10^3), чтобы получить
>значение миллисекунд.
>То же самое в отношении структуры timespec, там наносекунды, делятся на 1000000
>для отображения миллисекунд.
Гм.. чтобы получить милисекунды из микросекунд, нужно 10^-6 * 10^3 = 10^-3, разве не так?
АналогичноЮ, секунды (tv_sec) нужно делить на 1000 для получения милисекунда, разве не так?

Что такое timespec, нигде этой структуры не видел?


"пример из книги Стивенса 'UNIX network programmin, 2nd ed.'"
Отправлено Boris Polevoy , 20-Сен-06 12:59 
>>
>>struct timeval {
>>        long    
>>        tv_sec;  
>>      /* seconds (XXX should be
>>time_t) */
>>        suseconds_t    
>> tv_usec;        /* and
>>microseconds */
>>};
>>
>>tv_usec - это микросекунды, 10^-6 соответсвенно, делятся на 1000 (10^3), чтобы получить
>>значение миллисекунд.
>>То же самое в отношении структуры timespec, там наносекунды, делятся на 1000000
>>для отображения миллисекунд.
>Гм.. чтобы получить милисекунды из микросекунд, нужно 10^-6 * 10^3 = 10^-3,
>разве не так?
>АналогичноЮ, секунды (tv_sec) нужно делить на 1000 для получения милисекунда, разве не
>так?
>

tv_usec - это _количество_ микросекунд, тебе надо получить для отображения _количество_ миллисекунд, соответствующее _тому_же_ временному интервалу.
0.2 сек = 200 мс = 200000 мкс = 200000000 нс
теперь понятно, что на что делить?


>Что такое timespec, нигде этой структуры не видел?

man clock_gettime - это самая правильная функция для получения текущего времени


"пример из книги Стивенса 'UNIX network programmin, 2nd ed.'"
Отправлено анатолий , 20-Сен-06 14:20 
>tv_usec - это _количество_ микросекунд, тебе надо получить для отображения _количество_ миллисекунд,
>соответствующее _тому_же_ временному интервалу.
>0.2 сек = 200 мс = 200000 мкс = 200000000 нс
>теперь понятно, что на что делить?
>
Наконец-то дошло :) Спасибо!

>
>>Что такое timespec, нигде этой структуры не видел?
>
>man clock_gettime - это самая правильная функция для получения текущего времени
Наверное я на старой системе сижу, такого мана нет (RedHat 8.0). Эта posix-функция?


"пример из книги Стивенса 'UNIX network programmin, 2nd ed.'"
Отправлено Boris Polevoy , 20-Сен-06 14:30 
>>tv_usec - это _количество_ микросекунд, тебе надо получить для отображения _количество_ миллисекунд,
>>соответствующее _тому_же_ временному интервалу.
>>0.2 сек = 200 мс = 200000 мкс = 200000000 нс
>>теперь понятно, что на что делить?
>>
>Наконец-то дошло :) Спасибо!
>
>>
>>>Что такое timespec, нигде этой структуры не видел?
>>
>>man clock_gettime - это самая правильная функция для получения текущего времени
>Наверное я на старой системе сижу, такого мана нет (RedHat 8.0). Эта
>posix-функция?

FreeBSD:
man clock_gettime
STANDARDS
     The clock_gettime(), clock_settime(), and clock_getres() system calls
     conform to IEEE Std 1003.1b-1993 (``POSIX.1'').

QNX6:
Classification:
POSIX 1003.1 (Realtime Extensions)

для простого ping хватит и gettimeofday(2), там особой точности не надо.