找回密码
 加入
搜索
查看: 9620|回复: 27

[AU3基础] [已解决]请教“判断循环”问题

  [复制链接]
发表于 2010-4-21 17:40:36 | 显示全部楼层 |阅读模式
本帖最后由 waxy 于 2010-4-27 10:50 编辑

非常感谢sensel 针对“时间同步问题”的解答,我再次把他的原码贴出跟大家一起分享一下。不过在作一些完善时遇到一点小问题,大家帮忙看看。
一个关于“判断循环”的问题(这方面的知识我一直都没有完全掌握),大家都知道,网络都可能出现网线没连好或其它问题造成时间同步不了的情况
于是我就想加一个判断语句,出现同步失败即提示再来一次,直到OK为止,点“取消”则退出程序。我尝试的改了一下,可是没成功。不知道IF语句
里面有没有办法嵌入类似ContinueLoop来实现循环。谢谢!
#include <Date.au3>
Opt("MustDeclareVars", 1)
Opt("TrayAutoPause", 0)
Opt("TrayIconDebug", 1)


Global $pass , $fail
Local $sServer = "192.168.0.1"
If TimeSync($sServer) Then
        $pass=MsgBox(0x40, "提示", "与服务器 " & $sServer & " 时间同步成功。" & @CRLF & "当前时间: " & _Date_Time_SystemTimeToDateTimeStr(_Date_Time_GetLocalTime()))
Else
        $fail=MsgBox(5+48, "错误", "与服务器 " & $sServer & " 时间同步失败!" & @CRLF & "当前时间: " & _Date_Time_SystemTimeToDateTimeStr(_Date_Time_GetLocalTime()))
                If $fail=4 Then
                ;ContinueLoop 这个地方试好多方法,没办法写下去了。
EndIf
Exit


Func TimeSync($sServer)
        Local $tSystemTime

        If Ping($sServer, 250) = 0 Then Return 0
        $tSystemTime = _NetRemoteTOD($sServer)
        If @error Then Return 0

        If _Date_Time_SetSystemTime(DllStructGetPtr($tSystemTime)) Then
                Return 1
        Else
                Return 0
        EndIf
EndFunc   ;==>TimeSync

;===============================================================================
; 说明:   获取以 UTC 表示的指定服务器日期和时间信息
; 语法:   _NetRemoteTOD($sServer)
; 参数:   $sServer - 计算机名称
; 需要:   <Date.au3>
; 返回:   成功 - 包含服务器日期和时间的 $tagSYSTEMTIME 结构体
;         失败 - 0, 并设置 @error
; 备注:   @@MsdnLink@@ NetRemoteTOD
;===============================================================================
Func _NetRemoteTOD($sServer)
        Local $aResult, $tTIME_OF_DAY_INFO, $tSYSTEMTIME
        Local Const $tagTIME_OF_DAY_INFO = _
                        "dword tod_elapsedt;dword tod_msecs;" & _
                        "dword tod_hours;dword tod_mins;" & _
                        "dword tod_secs;dword tod_hunds;" & _
                        "long tod_timezone;dword tod_tinterval;" & _
                        "dword tod_day;dword tod_month;" & _
                        "dword tod_year;dword tod_weekday"

        $aResult = DllCall("netapi32.dll", "int", "NetRemoteTOD", "wstr", $sServer, "ptr*", 0)
        If @error Then Return SetError(@error, 0, 0)
        If $aResult[0] <> 0 Then Return SetError($aResult[0], 0, 0)

        $tTIME_OF_DAY_INFO = DllStructCreate($tagTIME_OF_DAY_INFO, $aResult[2])
        $tSYSTEMTIME = _Date_Time_EncodeSystemTime( _
                        DllStructGetData($tTIME_OF_DAY_INFO, "tod_month"), _
                        DllStructGetData($tTIME_OF_DAY_INFO, "tod_day"), _
                        DllStructGetData($tTIME_OF_DAY_INFO, "tod_year"), _
                        DllStructGetData($tTIME_OF_DAY_INFO, "tod_hours"), _
                        DllStructGetData($tTIME_OF_DAY_INFO, "tod_mins"), _
                        DllStructGetData($tTIME_OF_DAY_INFO, "tod_secs"), _
                        DllStructGetData($tTIME_OF_DAY_INFO, "tod_hunds") * 10)

        DllCall("netapi32.dll", "int", "NetApiBufferFree", "ptr", $aResult[2])
        Return $tSYSTEMTIME
EndFunc   ;==>_NetRemoteTOD

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2010-4-21 17:52:42 | 显示全部楼层
你这个是用服务器-客户端的模式同步时间?

其他的没看,就这个是很明显的错误:
$ntpServer = IniRead("time.ini","Setting","Host","") ;原NTP服务器地址是:time-nw.nist.gov

$ntpServer = IniRead("time.ini","Setting","port","") ;这一行程序虽然没报错,我估计是有问题的。

$ntpServer = IniRead("time.ini","Setting","Password","") ;这一段也是,实在没招了,写上去试试运气的,呵呵!

你的参数$ntpServer到底是想获取time.ini中的那个项?
应该是类似于下面用不同的变量获取不同的值:
$ntpServer = IniRead("time.ini","Setting","Host","") ;原NTP服务器地址是:time-nw.nist.gov

$ntpport = IniRead("time.ini","Setting","port","") ;这一行程序虽然没报错,我估计是有问题的。

$ntppassword = IniRead("time.ini","Setting","Password","") ;这一段也是,实在没招了,写上去试试运气的,呵呵!
 楼主| 发表于 2010-4-21 17:55:36 | 显示全部楼层
呵呵,多谢提醒,我再看一下。
发表于 2010-4-21 17:55:58 | 显示全部楼层
其实,与局域网的时间服务器同步可以用一条很简单的命令就可以了,象你这个代码,可以用:
Run(@ComSpec & " /c net time \\"&$ntpServer&" /set /y")
这条来同步时间
 楼主| 发表于 2010-4-21 17:56:52 | 显示全部楼层
回复 3# waxy

是的,那个小软件是有个服务端与客户端的,我就想用上面这段代码,代替它的客户端。
 楼主| 发表于 2010-4-21 17:58:35 | 显示全部楼层
回复 4# C.L
这个DOS命令我知道,现在在学习AU3所以什么东西都想用它来实现,呵呵,谢谢指点。
 楼主| 发表于 2010-4-21 18:35:54 | 显示全部楼层
还不行哦,应该是程序没有获取到端口与密码。
发表于 2010-4-21 21:00:59 | 显示全部楼层

RE: 与局域网的时间服务器同步问题

回复 7# waxy

改为
$ntpServer = IniRead("time.ini","Setting","Host","") ;原NTP服务器地址是:time-nw.nist.gov
$ntpport = IniRead("time.ini","Setting","port","") ;这一行程序虽然没报错,我估计是有问题的。
$ntppassword = IniRead("time.ini","Setting","Password","") ;这一段也是,实在没招了,写上去试试运气的,呵呵!
获取ini参数是没问题的
你可以在这后面用
MsgBox (0,"",$ntpServer&@CRLF&$ntpport&@CRLF&$ntppwd)
这个来看看获取情况。

另外,涉及到服务-客户端的软件,你要把服务端代码和客户端代码贴上来,要不谁也不知道错在那里
 楼主| 发表于 2010-4-22 08:55:41 | 显示全部楼层
回复 8# C.L
兄弟,服务-客户端的软件的代码的软件没办法贴上来,软件是一个朋友给的,也不知道他是从哪弄来的,代码肯定是弄不到的。
 楼主| 发表于 2010-4-22 09:23:16 | 显示全部楼层
再看了一下,该获取的信息都获取到了,可能问题不在这了。
 楼主| 发表于 2010-4-22 11:48:41 | 显示全部楼层
其实端口不用通过配置文件来获取,这一行已经指定了Dim $socket = UDPOpen(TCPNameToIP($ntpServer), 123),“123”就是端口号(只把它改成服务端软件开放的端口就行了),现在的问题就是如何通过软件的登录密码认证。
发表于 2010-4-22 14:56:47 | 显示全部楼层
运行了一下你提供的那个TimeSync.exe, 看到用的是TCP,建立的端口是11984
LZ的思路用UDP来连接,好象根本上思路就不对。
发表于 2010-4-22 15:07:57 | 显示全部楼层
本帖最后由 C.L 于 2010-4-22 15:09 编辑

那个软件的算法可能根本上和你想的都不一样,
1、服务端要从客户端那得到什么数据才能运行,这个你了解吗(错一个字节应该都不可能发送)?
2、服务端就算被你猜到了接受运行的数据,发送给客户端的数据格式又是什么?时间的读取从接受过来的数据中第几个字节开始计算,这个是否清楚?
3、服务端向客户端那个端口发送数据?不要说是77520,这个从服务端的端口来看,根本就不是。
这几个问题不解决,根本连接不上。
 楼主| 发表于 2010-4-22 15:21:15 | 显示全部楼层
回复 13# C.L

看来是没办法了,多谢了!windows其实可以把局域网内的任何一台机定义为时间源,用DOS命令实现时间同步方式是:net time \\IP或计算机名 /set /y ,这大家都知道,如果通AU3来调用DOS命令就是Run(@ComSpec & " /c net time \\"&$ntpServer&" /set /y");我想问的就是,不通过调用DOS命令,AU3有没有办法来实现这一时间同步动作。如果同步成功提示:“当前的时间为XXXX”,如果不成功(网络问题)则提示“网络故障未能实现时间同步”,并提示重试一次。谢谢!
发表于 2010-4-22 16:13:43 | 显示全部楼层
回复 14# waxy

这种小功能可以服务端和客户端都用AU3来写,AU3写这种网络服务,只是小意思。
思路:
1、服务端建立TCP或UDP 侦听,监听端口,如果端口有数据传入,检查数据,格式相符就读取系统时间,向相应的IP和端口发送
2、客户端向服务端发送特定数据(也可以将自身的IP和端口包进去),侦听端口,如果有数据传入,解开,获取时间,然后设置系统时间,设置成功与否,给出提示。

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-6-9 17:05 , Processed in 0.110355 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表