标题:连接NTP服务器,获取网络时间,请赐教
只看楼主
my2318
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:12
帖 子:233
专家分:577
注 册:2014-3-18
得分:4 
最简便方法,利用windows系统的时间同步功能,精度要求不高可以利用本地时间,要求高一些严谨一些,可以获取sql服务器时间,sql服务器时间可以同步授时网站时间。实际上,获取网络时间的目的一般是记录系统操作的时序时间。
2022-09-23 15:27
sych
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:179
专家分:183
注 册:2019-10-11
得分:0 
结果不重要,只看过程
2022-09-23 17:44
sych
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:179
专家分:183
注 册:2019-10-11
得分:0 
能用VFP实现,有成就感
2022-09-23 17:44
sych
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:179
专家分:183
注 册:2019-10-11
得分:0 
https://blog.
看着简单,想改编成vfp却处处掣肘
2022-09-24 20:32
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用sych在2022-9-24 20:32:28的发言:

https://blog.
看着简单,想改编成vfp却处处掣肘

200.205.253.254:123 这个NTP能用吗?
2022-09-25 08:23
sych
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:179
专家分:183
注 册:2019-10-11
得分:0 
这个也不行,就差一个生成报文的代码,发送不是问题,接收也不是问题
2022-09-25 10:00
sych
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:179
专家分:183
注 册:2019-10-11
得分:0 
原来的NTP服务器好像不 用发送报文,自动按UDP模式广播,而端口是123的是TCP连接,均需要先发送报文,才会返回报文
2022-09-25 10:02
sych
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:179
专家分:183
注 册:2019-10-11
得分:0 
我猜的,具体远离不懂的
2022-09-25 10:02
sych
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:179
专家分:183
注 册:2019-10-11
得分:0 
/* 构建 NTP 协议包 */
int ConstructPacket(char *Packet)
{
    char Version = 1;
    long SecondFrom1900;
    long Zero = 0;
    int Port;
    time_t timer;
   
    strcpy(Protocol,NTPV1);
    /* 判断协议版本 */
    if(strcmp(Protocol, NTPV1) || strcmp(Protocol,NTPV2) || strcmp(Protocol, NTPV3) || strcmp(Protocol, NTPV4))
    {
        Port = NTPPORT;
        Version = Protocol[6] - 0x30;
        Packet[0] = (Version << 3) | 3; //LI--Version--Mode
        Packet[1] = 0;                  //Startum
        Packet[2] = 0;                  //Poll interval
        Packet[3] = 0;                  //Precision

        /* 包括 Root delay、Root disperse 和 Ref Indentifier */
        memset(&Packet[4], 0, 12);
        /* 包括 Ref timestamp、Ori timastamp 和 Receive Timestamp */
        memset(&Packet[16], 0, 24);

        time(&timer);
        SecondFrom1900 = SecondBef1970 + (long)timer;
        SecondFrom1900 = htonl(SecondFrom1900);

        memcpy(&Packet[40], &SecondFrom1900, 4);
        memcpy(&Packet[44], &Zero, 4);
        return 48;
    }
    else    // time/udp
    {
        Port = TIMEPORT;
        memset(Packet, 0, 4);
        return 4;
    }
    return 0;
}
这个构建NTP协议包不知道怎么转到vfp中,看了你前一阵子写的构建struct类型的数据,还是理解不了
2022-09-25 11:39
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用sych在2022-9-25 11:39:04的发言:
    ......
    strcpy(Protocol,NTPV1);
    /* 判断协议版本 */
    if(strcmp(Protocol, NTPV1) || strcmp(Protocol,NTPV2) || strcmp(Protocol, NTPV3) || strcmp(Protocol, NTPV4))
    {
        Port = NTPPORT;
        Version = Protocol[6] - 0x30;
        ......
        SecondFrom1900 = SecondBef1970 + (long)timer;
        ......
    }

代码好象不完整或有问题
1、strcpy(Protocol,NTPV1);
    #define NTPV1 "NTP/V1"
    相当于 Protocol = "NTP/V1"
2、if(strcmp(Protocol, NTPV1) || strcmp(Protocol,NTPV2) || strcmp(Protocol, NTPV3) || strcmp(Protocol, NTPV4))
    相当于 if (Protocol != NTPV1) or (Protocol != NTPV2) or (Protocol != NTPV3) or (Protocol != NTPV4)
    随便一个Protocol也可能满足条件
3、Version = Protocol[6] - 0x30;
    Protocol = "NTP/V1" 时,Protocol[6]应该是'\0'(字符串结束符),Protocol[0]是'N'
4、SecondFrom1900 = SecondBef1970 + (long)timer;
    SecondBef1970 从开始声明 double SecondBef1970; 之后就没有定义,在这时属未定义行为,带有不确定因素。
2022-09-25 16:18



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-510100-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.123745 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved