Всем привет.Разбираюсь с примером из главы 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;
Поправьте меня, либо я не замечаю очевидного?
Спасибо.
>Всем привет.
>
>Разбираюсь с примером из главы 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 для отображения миллисекунд.
>
>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, нигде этой структуры не видел?
>>
>>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 - это самая правильная функция для получения текущего времени
>tv_usec - это _количество_ микросекунд, тебе надо получить для отображения _количество_ миллисекунд,
>соответствующее _тому_же_ временному интервалу.
>0.2 сек = 200 мс = 200000 мкс = 200000000 нс
>теперь понятно, что на что делить?
>
Наконец-то дошло :) Спасибо!>
>>Что такое timespec, нигде этой структуры не видел?
>
>man clock_gettime - это самая правильная функция для получения текущего времени
Наверное я на старой системе сижу, такого мана нет (RedHat 8.0). Эта posix-функция?
>>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), там особой точности не надо.