linux 下使rdate命令支持ipv6 ntp server 同步时间

如果使用linux 下,busybox自带的rdate命令 去ipv6 的ntp server 同步时间的话,会提示invalid argument ;无效参数。

那么现在下载rdate的源码并对其进行修改。源码地址 http://download.csdn.net/detail/wanhl1990/6823025 

修改内容如下,下载源码后解压,进入解压后的文件,修改src/ntp.c 的sync_ntp() 函数的内容。

       

       struct ntp_data data;
       struct sockaddr_in6 *peer1 ;    // define peer1 +++;

        deadline = current_time(JAN_1970) + delay;
        *offset = 0.0;
        *error = NTP_INSANITY;

        //change peer to _in6 , ;
       peer1 = (struct sockaddr_in6 *)peer ;//++++++

        if (connect(fd, peer1, SA_LEN(peer1)) < 0) { //modify
IPv6的结构体sockaddr_in6比sockaddr_in的结构要大,可以存储来自IPv4的连接的ip等信息 。所以按照这个方式来进行修改。

修改完成后,对整个rdate文件进行编译,得到rdate可执行命令后,就可以安装帮助信息中的操作方法进行信息同步了。例如:rdate -n 65.55.56.206. 或者rdate -n 2001:288:5400::2.

执行完成后,会得到当前时间与服务器同步来的时间之间的差值adjustment。使用shell脚本将该差值adjustment获取后,进行时间调整。
out=`exec /sur/bin/rdate -n 2001:288:5400::2 -v -p`
res=$?

adjustment=`echo $out | grep adjust | sed -e 's/^.*local clock by //g' | sed -e 's/.[0-9]* seconds.*$//g' | sed -e 's/-0/0/'`

或者这个adjustment后,使用时间戳进行时间设置即达到时间同步的作用了。


给个例子:

static int sntp_restart_adjustment(int adjustment)
{
    struct timeval tv_old = {}, tv_new = {};

    /* Get current system's time. */
    if (gettimeofday(&tv_old, NULL) < 0)
    {
        printf ("gettimeofday() failed
");
        return 1 ;
    }
   
    /* Add the adjustment (measured in seconds) to the current system's time. */
    tv_new.tv_sec = tv_old.tv_sec + adjustment;

    /* Change system's time with the newly adjusted time. */
    if (settimeofday(&tv_new, NULL) < 0) 
    {
        printf ("settimeofday() failed
");
        return 1 ;
    }
        
    system("/usr/sbin/rtc %s", "up2chip");

    return 0;
}


哦了!这就是在做ipv6支持sntp所做的工作。仅供参考,欢迎留言

原文地址:https://www.cnblogs.com/wanhl/p/3510313.html