| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2205 人关注过本帖, 1 人收藏
标题:连接NTP服务器,获取网络时间,请赐教
取消只看楼主 加入收藏
sych
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:317
专家分:448
注 册:2019-10-11
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:13 
连接NTP服务器,获取网络时间,请赐教
SET CENTURY on
SET DATE ANSI
SET HOURS TO 24
CLEAR
?1
fh=_GetNetTime("128.138.140.44",13)  &&这个成功,以下均失败,不知道为什么
?zh(fh)

?2
fh=_GetNetTime("s1a.time.,123)
?zh(fh)

?"2-1"
fh=_GetNetTime("114.118.7.163",123)
?zh(fh)

?"2-2"
fh=_GetNetTime("ntp.ntsc.,123)
?zh(fh)

?"3-1"
fh=_GetNetTime("139.199.215.251",123)
?zh(fh)

?"3-2"
fh=_GetNetTime("ntp.,123)
?zh(fh)
retu

FUNCTION _GetNetTime(szNtpIP, ddNtpPort)
LOCAL stWsaData, stSockAddr, szBuffer, dhSocket
LOCAL i, ddLen,ret

DECLARE LONG WSAStartup  IN "Ws2_32" LONG, STRING@
DECLARE LONG WSACleanup  IN "Ws2_32"
DECLARE LONG socket      IN "Ws2_32" LONG, LONG, LONG
DECLARE LONG connect     IN "Ws2_32" LONG, STRING@, LONG
DECLARE LONG recv        IN "Ws2_32" LONG, STRING@, LONG, LONG
DECLARE LONG closesocket IN "Ws2_32" LONG
DECLARE LONG inet_addr   IN "Ws2_32" STRING@
DECLARE LONG htons       IN "Ws2_32" LONG
DECLARE INTEGER gethostbyname in WSOCK32 String
DECLARE LONG inet_ntoa     IN "Ws2_32" LONG

stWsaData  = REPLICATE(0h00, 398)
szBuffer   = REPLICATE(0h00, 256)
stSockAddr = REPLICATE(0h00, 16)

WSAStartup(0x202, @stWsaData)
dhSocket = socket(2, 1, 6)
IF ISDIGIT(szNtpIP)
    stSockAddr = 0h0200;
        + BINTOC(htons(ddNtpPort), "2RS");
        + BINTOC(inet_addr(@szNtpIP), "4RS");
        + REPLICATE(0h00, 8)
else
    RET = CTOBIN(SYS(2600, gethostbyname(@szNtpIP) + 12, 4), "4RS")  &&偏移12,IP地址列表
    RET = CTOBIN(SYS(2600, RET, 4), "4RS")  &&IP地址
    stSockAddr = 0h0200;
        + BINTOC(htons(ddNtpPort), "2RS");
        + SYS(2600, RET, 4);
        + REPLICATE(0h00, 8)
endif
ddLen  = 0
IF connect(dhSocket, @stSockAddr, LEN(stSockAddr)) != -1
    FOR i = 1 TO 9
        ddLen = recv(dhSocket, @szBuffer, LEN(szBuffer), 0)
        IF ddLen != -1
            EXIT
        ENDIF
    ENDFOR
ENDIF
closesocket(dhSocket)
WSACleanup()
IF ddLen > 0
    szBuffer = LEFT(szBuffer, ddLen)
    RETURN szBuffer
ELSE
*        MESSAGEBOX("网络异常,时间同步失败")
    RETURN ""
ENDIF
ENDFUNC

PROCEDURE zh
LPARAMETERS szutc
IF EMPTY(szutc)
else
    ddYear   = INT(VAL(SUBSTR(szUTC, 8, 2))) + 2000
    ddMonth  = INT(VAL(SUBSTR(szUTC, 11, 2)))
    ddDay    = INT(VAL(SUBSTR(szUTC, 14, 2)))
    ddHour   = INT(VAL(SUBSTR(szUTC, 17, 2)))
    ddMinute = INT(VAL(SUBSTR(szUTC, 20, 2)))
    ddSecond = INT(VAL(SUBSTR(szUTC, 23, 2)))
    RETURN DATETIME(ddYear,ddMonth,ddDay,ddHour,ddMinute,ddSecond)+8*3600
endif
RETURN ""
搜索更多相关主题的帖子: INT STRING LONG IF ret 
2022-09-20 15:45
sych
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:317
专家分:448
注 册:2019-10-11
收藏
得分:0 
吹版,你提供的都可以
只是我上面的代码怎么会有的正常,有的失败(代码是我网上抄的)
2022-09-20 17:21
sych
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:317
专家分:448
注 册:2019-10-11
收藏
得分:0 
关键是,国内的一个也不行,第一个是国外的
2022-09-20 17:23
sych
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:317
专家分:448
注 册:2019-10-11
收藏
得分:0 
都不介绍连接端口
2022-09-20 17:27
sych
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:317
专家分:448
注 册:2019-10-11
收藏
得分:0 
fh=_GetNetTime("time.nist.gov",13)
不屑努力,又测试成功一个
2022-09-20 17:30
sych
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:317
专家分:448
注 册:2019-10-11
收藏
得分:0 
结果不重要,只看过程
2022-09-23 17:44
sych
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:317
专家分:448
注 册:2019-10-11
收藏
得分:0 
能用VFP实现,有成就感
2022-09-23 17:44
sych
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:317
专家分:448
注 册:2019-10-11
收藏
得分:0 
https://blog.
看着简单,想改编成vfp却处处掣肘
2022-09-24 20:32
sych
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:317
专家分:448
注 册:2019-10-11
收藏
得分:0 
这个也不行,就差一个生成报文的代码,发送不是问题,接收也不是问题
2022-09-25 10:00
sych
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:317
专家分:448
注 册:2019-10-11
收藏
得分:0 
原来的NTP服务器好像不 用发送报文,自动按UDP模式广播,而端口是123的是TCP连接,均需要先发送报文,才会返回报文
2022-09-25 10:02
快速回复:连接NTP服务器,获取网络时间,请赐教
数据加载中...
 
   



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

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