找回密码
 加入
搜索
楼主: waxy

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

  [复制链接]
 楼主| 发表于 2010-4-22 20:13:15 | 显示全部楼层
回复 15# C.L
哈哈,谢谢指点,不过这对我一个菜鸟来说难度还是蛮大的。
发表于 2010-4-22 20:31:50 | 显示全部楼层
UDPOpen ( IP地址, 端口 [,标志] ),此函数需要的是IP地址,TCPNameToIP($ntpServer)是将一个域名转换成一个IP 地址。可你从配置文件中读取的就是IP地址啊。所以这一句Dim $socket = UDPOpen(TCPNameToIP($ntpServer), 123) 需要修改,在根据 8楼方法修改的基础上再将此句可改成如下一试: Dim $socket = UDPOpen($ntpServer,$ntpport)
 楼主| 发表于 2010-4-23 14:57:25 | 显示全部楼层
自己先顶一下,别让帖子沉下去了。
发表于 2010-4-24 08:30:34 | 显示全部楼层
时间同步的例子很多哦
发表于 2010-4-24 23:21:40 | 显示全部楼层
没看懂你到底要搞什么。
如果你要连接NTP服务器来同步时间,你就要去分析NTP协议和数据包结构,实现NTP客户端。
如果你要用那段网页代码获取远程时间,用个正则拆分网页元素也可以。
如果你要用au3写一个完整的C/S结构,那也行,自定义一个数据包,包含服务端时间就可以了。
但是看你的代码,实在看不出你想要用哪种办法。
发表于 2010-4-24 23:36:40 | 显示全部楼层
发表于 2010-4-24 23:40:42 | 显示全部楼层
本帖最后由 sensel 于 2010-4-24 23:44 编辑

还有一个简单的方法,用API实现 net time 功能。就是调用NetRemoteTOD获取服务器时间,再用这个时间来设置本机。获取服务器时间代码如下,返回的是一个数组,内容同结构体_TIME_OF_DAY_INFO,具体参考 http://msdn.microsoft.com/en-us/library/aa370959.aspx
#include <Array.au3>
Opt("MustDeclareVars", 1)
Opt("TrayAutoPause", 0)
Opt("TrayIconDebug", 1)

Local $aResult = _NetRemoteTOD("192.168.0.1")
Local $iError = @error
_ArrayDisplay($aResult, $iError)
Exit

Func _NetRemoteTOD($sServer)
        Local $aTOD[12], $aResult, $tTIME_OF_DAY_INFO
        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, $aTOD)
        If $aResult[0] <> 0 Then Return SetError($aResult[0], 0, $aTOD)

        $tTIME_OF_DAY_INFO = DllStructCreate($tagTIME_OF_DAY_INFO, $aResult[2])
        $aTOD[0] = DllStructGetData($tTIME_OF_DAY_INFO, "tod_elapsedt")
        $aTOD[1] = DllStructGetData($tTIME_OF_DAY_INFO, "tod_secs")
        $aTOD[2] = DllStructGetData($tTIME_OF_DAY_INFO, "tod_hours")
        $aTOD[3] = DllStructGetData($tTIME_OF_DAY_INFO, "tod_mins")
        $aTOD[4] = DllStructGetData($tTIME_OF_DAY_INFO, "tod_secs")
        $aTOD[5] = DllStructGetData($tTIME_OF_DAY_INFO, "tod_hunds")
        $aTOD[6] = DllStructGetData($tTIME_OF_DAY_INFO, "tod_timezone")
        $aTOD[7] = DllStructGetData($tTIME_OF_DAY_INFO, "tod_tinterval")
        $aTOD[8] = DllStructGetData($tTIME_OF_DAY_INFO, "tod_day")
        $aTOD[9] = DllStructGetData($tTIME_OF_DAY_INFO, "tod_month")
        $aTOD[10] = DllStructGetData($tTIME_OF_DAY_INFO, "tod_year")
        $aTOD[11] = DllStructGetData($tTIME_OF_DAY_INFO, "tod_weekday")

        DllCall("netapi32.dll", "int", "NetApiBufferFree", "ptr", $aResult[2])
        Return $aTOD
EndFunc   ;==>_NetRemoteTOD
发表于 2010-4-25 07:06:51 | 显示全部楼层
花点时间,写了NetRemoteTOD方式的完整代码。改变_NetRemoteTOD返回类型,方便au3 UDF直接调用。同net time一样,本地账户必须有远程服务器的网络登录权限,服务器必须开Server服务。代码在WinXP/2003下测试通过。
#include <Date.au3>
Opt("MustDeclareVars", 1)
Opt("TrayAutoPause", 0)
Opt("TrayIconDebug", 1)


Local $sServer = "192.168.0.1"
If TimeSync($sServer) Then
        MsgBox(0x40, "提示", "与服务器 " & $sServer & " 时间同步成功。" & @CRLF & "当前时间: " & _Date_Time_SystemTimeToDateTimeStr(_Date_Time_GetLocalTime()))
Else
        MsgBox(0x30, "错误", "与服务器 " & $sServer & " 时间同步失败!" & @CRLF & "当前时间: " & _Date_Time_SystemTimeToDateTimeStr(_Date_Time_GetLocalTime()))
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威望 +2 贡献 +5 收起 理由
afan + 2 + 5

查看全部评分

 楼主| 发表于 2010-4-26 08:48:10 | 显示全部楼层
花点时间,写了NetRemoteTOD方式的完整代码。改变_NetRemoteTOD返回类型,方便au3 UDF直接调用。同net time ...
sensel 发表于 2010-4-25 07:06

非常感谢你的解答,本来我自己都差不多放弃了,以为没解了,太意外。其它没什么好说的,只能说谢谢了!我去试一下先,然后再好好的分析一下。
 楼主| 发表于 2010-4-26 09:32:43 | 显示全部楼层
本帖最后由 waxy 于 2010-4-26 09:33 编辑

非常感谢sensel 我分别在XP、WIN7系统试了一下,都是成功的!不过想更进一步完善一下,遇到问题了,有时间再帮我看一下吧。
 楼主| 发表于 2010-4-26 19:28:21 | 显示全部楼层
那位高手有时间帮我看看吧。
发表于 2010-4-27 02:50:07 | 显示全部楼层
最简洁的,结合while循环与if分支,3条语句构成。
While Not TimeSync($sServer)
        If MsgBox(0x21, "错误", "与服务器 " & $sServer & " 时间同步失败!" & @CRLF & _
                        "当前时间: " & _Date_Time_SystemTimeToDateTimeStr(_Date_Time_GetLocalTime()) & @CRLF & @CRLF & _
                        "单击“确定”重试,单击“取消”退出。") = 2 Then ExitLoop
WEnd

评分

参与人数 1威望 +5 收起 理由
afan + 5 你睡得更晚啊~

查看全部评分

 楼主| 发表于 2010-4-27 10:37:31 | 显示全部楼层
本帖最后由 waxy 于 2010-4-27 10:48 编辑
最简洁的,结合while循环与if分支,3条语句构成。
sensel 发表于 2010-4-27 02:50

谢谢,我想到功能都实现了。不过整个脚本还有蛮多地方看不懂,还得好好的去研究研究!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-6-13 18:36 , Processed in 0.085017 second(s), 16 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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