table of contents
RTIME(3) | Руководство программиста Linux | RTIME(3) |
ИМЯ¶
rtime - получение времени с удалённого узла
ОБЗОР¶
#include <rpc/des_crypt.h> int rtime(struct sockaddr_in *addrp, struct rpc_timeval *timep, struct rpc_timeval *timeout);
ОПИСАНИЕ¶
Для получения времени с удалённого компьютера функция использует протокол Time Server Protocol, описанный в RFC 868.
Time Server Protocol возвращает время в секундах начиная с 1 января 1900 года 00:00:00 UTC. Данная функция самостоятельно вычитает подходящую константу для того, чтобы преобразовать результат в секундах от начала Эпохи — 1970-01-01 00:00:00 +0000 (UTC).
Если timeout не равно NULL, то будет использоваться сокет udp/time (порт 37), иначе — сокет tcp/time (порт 37).
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
При успешном выполнении возвращается 0, а полученное 32-битное значение времени сохраняется в timep->tv_sec. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.
ОШИБКИ¶
Могут возникнуть все ошибки задействованных в работе функций (sendto(2), poll(2), recvfrom(2), connect(2), read(2)), а также:
ЗАМЕЧАНИЯ¶
Поддерживается только IPv4.
Некоторые версии in.timed поддерживают только TCP. Попробуйте пример программы с установленной в 1 значением use_tcp.
В libc5
используется
прототип
int rtime(struct sockaddr_in *, struct timeval *, struct timeval *);
для
которого
требуется
<sys/time.h> вместо
<rpc/auth_des.h>.
ДЕФЕКТЫ¶
rtime() в glibc 2.2.5 и ниже на 64-битных компьютерах работает некорректно.
ПРИМЕР¶
Для этого
примера
требуется
поднятие и
открытие
порта 37. Вы
можете
проверить
это,
убедившись
в том, что в
файле /etc/inetd.conf
запись time
раскомментирована.
Программа
подключается
к
компьютеру
с именем
«linux».
Использование
«localhost» не
сработает.
В качестве
результата
будет
возвращено
локальное
время
компьютера
«linux».
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <time.h> #include <rpc/auth_des.h> #include <netdb.h> int use_tcp = 0; char *servername = "linux"; int main(void) {
struct sockaddr_in name;
struct rpc_timeval time1 = {0,0};
struct rpc_timeval timeout = {1,0};
struct hostent *hent;
int ret;
memset((char *) &name, 0, sizeof(name));
sethostent(1);
hent = gethostbyname(servername);
memcpy((char *) &name.sin_addr, hent->h_addr, hent->h_length);
ret = rtime(&name, &time1, use_tcp ? NULL : &timeout);
if (ret < 0)
perror("rtime error");
else
printf("%s\n", ctime((time_t *) &time1.tv_sec));
exit(EXIT_SUCCESS); }
СМОТРИТЕ ТАКЖЕ¶
ntpdate(1), inetd(8)
2010-02-25 | GNU |