| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 358 人关注过本帖, 1 人收藏
标题:连接NTP服务器,获取网络时间,请赐教
只看楼主 加入收藏
sych
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:170
专家分:164
注 册:2019-10-11
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:23 
连接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
厨师王德榜
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:168
帖 子:874
专家分:4254
注 册:2013-2-16
收藏
得分:4 
中科院这个,改服务了吧,看这个 https://www.
2022-09-20 16:23
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:379
帖 子:9221
专家分:39540
注 册:2014-5-20
收藏
得分:4 
这个也可以
https://www.
https://www.
2022-09-20 17:00
sych
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:170
专家分:164
注 册:2019-10-11
收藏
得分:0 
吹版,你提供的都可以
只是我上面的代码怎么会有的正常,有的失败(代码是我网上抄的)
2022-09-20 17:21
sych
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:170
专家分:164
注 册:2019-10-11
收藏
得分:0 
关键是,国内的一个也不行,第一个是国外的
2022-09-20 17:23
sych
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:170
专家分:164
注 册:2019-10-11
收藏
得分:0 
都不介绍连接端口
2022-09-20 17:27
sych
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:170
专家分:164
注 册:2019-10-11
收藏
得分:0 
fh=_GetNetTime("time.nist.gov",13)
不屑努力,又测试成功一个
2022-09-20 17:30
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:379
帖 子:9221
专家分:39540
注 册:2014-5-20
收藏
得分:0 
回复 4楼 sych
3楼的通过WEB就可以获取,相对简单些
2022-09-20 17:37
kangss
Rank: 3Rank: 3
等 级:论坛游侠
威 望:6
帖 子:63
专家分:152
注 册:2014-6-12
收藏
得分:4 
要求精度不高,可以试试百度
CLEAR
ON ERROR

xmlHttp = CREATEOBJECT("Microsoft.XMLHTTP")
xmlhttp.open("get","https://www.baidu.com", .F.)
xmlHttp.send

m._datetime = UPPER(xmlHttp.getallResponseHeaders)
m._datetime = ALLTRIM(STREXTRACT(m._datetime, "DATE:", CHR(13)))

* 星期一:Mon.=Monday星期二:Tues.=Tuesday星期三:Wed.=Wednesday星期四:Thur.=Thursday星期五:Fri.=Friday星期六:Sat.=Saturday 星期天:Sun.=Sunday
* 一月=JAN. Jan.=January    二月=FEB. Feb.=February        三月=MAR. Mar.=March        四月=APR. Apr.=April        五月=MAY May=May        六月=JUN. Jun.=June
* 七月=JUL. Jul.=July        八月=AUG. Aug.=August        九月=SEP. Sept.=September    十月=OCT. Oct.=October        十一月=NOV. Nov.=November    十二月=DEC. Dec.=December

LOCAL m._年, m._月, m._日    && SAT, 10 OCT 2020 06:45:07 GMT

m._年 = STREXTRACT(m._datetime, SPACE(1), SPACE(1), 3)
m._月 = STREXTRACT(m._datetime, SPACE(1), SPACE(1), 2)

m._月 = ICASE(m._月 = "JAN", "1", m._月 = "FEB", "2", m._月 = "MAR", "3", m._月 = "APR", "4", m._月 = "MAY", "5", m._月 = "JUN", "6", ;
 m._月 = "JUL", "7", m._月 = "AUG", "8", m._月 = "SEP", "9", m._月 = "OCT", "10", m._月 = "NOV", "11", m._月 = "DEC", "12")

m._日 = STREXTRACT(m._datetime, SPACE(1), SPACE(1), 1)

m._datetime = CTOT(m._年 + "." + m._月 + "." +  m._日 + " " + STREXTRACT(m._datetime, SPACE(1), SPACE(1), 4)) + 8 * 60 * 60    &&     获取的时间差 8 小时
?_datetime


xmlhttp.open("Get","http://time.nist.gov:13/",.f.)
xmlhttp.send()
?xmlhttp.responsetext
2022-09-21 11:11
csyx
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:190
专家分:846
注 册:2018-3-13
收藏
得分:4 
发完贴,发现跟楼上方法类同


[此贴子已经被作者于2022-9-21 12:30编辑过]

2022-09-21 12:25
快速回复:连接NTP服务器,获取网络时间,请赐教
数据加载中...
 
   



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

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