代码求简化
本帖最后由 bingxing8000 于 2011-2-23 18:23 编辑Bug :不能关闭程序,不能按顺序测试#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
$form=GUICreate("服务器监控",600,320)
GUISetState(@SW_SHOW)
Local $path
$path=@ScriptDir & "\server.ini"
$search=FileFindFirstFile($path)
If $search= -1 Then
MsgBox(0,"警告","软件的配置文件不存在")
Exit
EndIf
$inifeil=@ScriptDir & "\server.ini"
$a=IniRead($inifeil,"服务器地址" ,"服务器名","")
$a1=IniRead($inifeil,"服务器地址" ,"IP地址","")
$a2=IniRead($inifeil,"服务器地址" ,"端口","")
$a3=IniRead($inifeil,"服务器地址1" ,"服务器名","")
$a4=IniRead($inifeil,"服务器地址1" ,"IP地址","")
$a5=IniRead($inifeil,"服务器地址1" ,"端口","")
$a6=IniRead($inifeil,"服务器地址2" ,"服务器名","")
$a7=IniRead($inifeil,"服务器地址2" ,"IP地址","")
$a8=IniRead($inifeil,"服务器地址2" ,"端口","")
$a9=IniRead($inifeil,"服务器地址3" ,"服务器名","")
$b1=IniRead($inifeil,"服务器地址3" ,"IP地址","")
$b2=IniRead($inifeil,"服务器地址3" ,"端口","")
$b3=IniRead($inifeil,"服务器地址4" ,"服务器名","")
$b4=IniRead($inifeil,"服务器地址4" ,"IP地址","")
$b5=IniRead($inifeil,"服务器地址4" ,"端口","")
$b6=IniRead($inifeil,"服务器地址5" ,"服务器名","")
$b7=IniRead($inifeil,"服务器地址5" ,"IP地址","")
$b8=IniRead($inifeil,"服务器地址5" ,"端口","")
$b9=IniRead($inifeil,"服务器地址6" ,"服务器名","")
$ab=IniRead($inifeil,"服务器地址6" ,"IP地址","")
$ab2=IniRead($inifeil,"服务器地址6" ,"端口","")
GUICtrlCreateLabel("服务器名",50,20,50,20)
GUICtrlCreateLabel("IP地址",220,20,50,20)
GUICtrlCreateLabel("端口",380,20,30,20)
GUICtrlCreateLabel("网络状态",480,20,50,20)
GUICtrlCreateInput(@ComputerName,30,270,100,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput(@IPAddress1,210,270,100,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput(@IPAddress2,380,270,100,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($a,10,40,130,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($a1,180,40,130,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($a2,360,40,70,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
$input=GUICtrlCreateInput("",470,40,100,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($a3,10,70,130,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($a4,180,70,130,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($a5,360,70,70,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
$input2=GUICtrlCreateInput("",470,70,100,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($a6,10,100,130,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($a7,180,100,130,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($a8,360,100,70,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
$input3=GUICtrlCreateInput("",470,100,100,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($a9,10,130,130,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($b1,180,130,130,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($b2,360,130,70,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
$input4=GUICtrlCreateInput("",470,130,100,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($b3,10,160,130,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($b4,180,160,130,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($b5,360,160,70,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
$input5=GUICtrlCreateInput("",470,160,100,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($b6,10,190,130,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($b7,180,190,130,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($b8,360,190,70,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
$input6=GUICtrlCreateInput("",470,190,100,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($b9,10,220,130,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($ab,180,220,130,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
GUICtrlCreateInput($ab2,360,220,70,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
$input7=GUICtrlCreateInput("",470,220,100,20,BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY,$WS_BORDER))
Check_TCP_PORT()
;===========检查TCP端口是否打开================
Func Check_TCP_PORT()
$i=2
While $i < 10
sleep(1000)
TCPStartUp()
$socket = TCPConnect($a1,$a2)
If $socket=-1 Then
ping($a1)
switch @error
case 0
GUICtrlSetData ($input2,"端口不正确")
case 1
GUICtrlSetData($input2,"无法连接端口")
case 2
GUICtrlSetData($input2,"网络不可达")
Case 3
GUICtrlSetData($input2,"错误目的地")
Case 4
GUICtrlSetData($input2,"未知错误")
EndSwitch
else
GUICtrlSetData($input2,"网络正常")
EndIf
TCPShutdown()
WEnd
EndFunc ;>=结束程序
While 1
$msg=GUIGetMsg()
Select
Case $msg=$GUI_EVENT_CLOSE
Exit
EndSelect
WEnd配置文件是:[服务器地址]
服务器名=录音服务器1号
IP地址=192.168.18.84
端口=3389
[服务器地址1]
服务器名=录音服务器2号
IP地址=192.168.18.85
端口=3389
[服务器地址2]
服务器名=录音服务器3号
IP地址=192.168.18.86
端口=3389
[服务器地址3]
服务器名=录音服务器4号
IP地址=192.168.18.87
端口=3389
[服务器地址4]
服务器名=录音服务器5号
IP地址=192.168.18.91
端口=3389
[服务器地址5]
服务器名=录音服务器6号
IP地址=192.168.18.93
端口=3389
[服务器地址6]
服务器名=录音服务器7号
IP地址=192.168.18.94
端口=3389 配置文件不发出来怎么看呢? 本帖最后由 ceoguang 于 2011-2-23 22:01 编辑
AutoItSetOption("GUIOnEventMode", 1)
AutoItSetOption("TCPTimeout", 100) ;此选项并不能避免TCP超时引起的线程阻塞
Local Const $IniFeil = @ScriptDir & "\server.ini"
$form = GUICreate("服务器监控", 600, 320)
If Not FileExists($IniFeil) Then
Exit MsgBox(16, "警告", "软件的配置文件不存在", -1, $form)
EndIf
TCPStartup()
GUISetOnEvent(-3, "GuiEvent")
GUICtrlCreateLabel("服务器名", 50, 20, 50, 20)
GUICtrlCreateLabel("IP地址", 220, 20, 50, 20)
GUICtrlCreateLabel("端口", 380, 20, 30, 20)
GUICtrlCreateLabel("网络状态", 480, 20, 50, 20)
Local $Address = ["服务器地址", "服务器地址1", "服务器地址2", "服务器地址3", "服务器地址4", "服务器地址5", "服务器地址6"]
Global $Ip, $Port, $Status
Global $x = 0
For $i = 0 To 6
$Ip[$i] = IniRead($IniFeil, $Address[$i], "IP地址", "未填写")
$Port[$i] = IniRead($IniFeil, $Address[$i], "端口", "未填写")
GUICtrlCreateInput(IniRead($IniFeil, $Address[$i], "服务器名", "未填写"), 10, 40 + $i * 30, 130, 20, 0x00800881)
GUICtrlCreateInput($Ip[$i], 180, 40 + $i * 30, 130, 20, 0x00800881)
GUICtrlCreateInput($Port[$i], 360, 40 + $i * 30, 70, 20, 0x00800881)
$Status[$i] = GUICtrlCreateInput("未检测", 470, 40 + $i * 30, 100, 20, 0x00800881)
Next
GUICtrlCreateInput(@ComputerName, 30, 270, 100, 20, 0x00800881)
GUICtrlCreateInput(@IPAddress1, 210, 270, 100, 20, 0x00800881)
GUICtrlCreateInput(@IPAddress2, 380, 270, 100, 20, 0x00800881)
GUISetState()
AdlibRegister("Check_TCP_PORT", 1000) ;一秒检查一次
While Sleep(1e8)
WEnd
;===========检查TCP端口是否打开================
Func Check_TCP_PORT()
If $x = 7 Then $x = 0
If StringRegExp($Ip[$x], "((2\d|25|?\d\d?)\.){3}(2\d|25|?\d\d?)") And _
StringRegExp($Port[$x], "^(||||)$") Then
;使用正则检测IP是否规范,端口是否在1-65535
GUICtrlSetData($Status[$x], "检测中...")
$Socket = TCPConnect($Ip[$x], $Port[$x])
If $Socket = -1 Then
Ping($Ip[$x])
Switch @error
Case 0
GUICtrlSetData($Status[$x], "端口不正确")
Case 1
GUICtrlSetData($Status[$x], "无法连接端口")
Case 2
GUICtrlSetData($Status[$x], "网络不可达")
Case 3
GUICtrlSetData($Status[$x], "错误目的地")
Case 4
GUICtrlSetData($Status[$x], "未知错误")
EndSwitch
Else
GUICtrlSetData($Status[$x], "网络正常")
TCPCloseSocket($Socket);关闭现有的wsa连接
EndIf
Else
If $Ip[$x] <> "未填写" Or $Port[$x] <> "未填写" Or Not ($Ip[$x]) Or Not ($Port[$x]) Then GUICtrlSetData($Status[$x], "ip或端口不规范")
EndIf
$x += 1
EndFunc ;==>Check_TCP_PORT
Func GuiEvent()
Switch @GUI_CtrlId
Case -3
TCPShutdown()
Exit
EndSwitch
EndFunc ;==>GuiEvent
膜拜,膜拜~!!
再次被您的技术折服。
谢谢您的无私帮助。 可惜不能多线程 回复 5# bingxing8000
一个线程能做的事就不要考虑多线程,假若au3有朝一日能多线程的话你也会为线程同步等问题烦恼。
以下这个是类似多线程的原理.不过用的是时钟计数器.
#NoTrayIcon
#include <Timers.au3>
AutoItSetOption("GUIOnEventMode", 1)
AutoItSetOption("TCPTimeout", 100) ;此选项并不能避免TCP超时引起的线程阻塞
Local Const $IniFeil = @ScriptDir & "\server.ini"
$form = GUICreate("服务器监控", 600, 320)
If Not FileExists($IniFeil) Then
Exit MsgBox(16, "警告", "软件的配置文件不存在", -1, $form)
EndIf
TCPStartup()
GUISetOnEvent(-3, "GuiEvent")
GUICtrlCreateLabel("服务器名", 50, 20, 50, 20)
GUICtrlCreateLabel("IP地址", 220, 20, 50, 20)
GUICtrlCreateLabel("端口", 380, 20, 30, 20)
GUICtrlCreateLabel("网络状态", 480, 20, 50, 20)
Local $Address = ["服务器地址", "服务器地址1", "服务器地址2", "服务器地址3", "服务器地址4", "服务器地址5", "服务器地址6"]
Global $Ip, $Port, $Status, $Timer
;Global $x = 0
For $i = 0 To 6
$Ip[$i] = IniRead($IniFeil, $Address[$i], "IP地址", "未填写")
$Port[$i] = IniRead($IniFeil, $Address[$i], "端口", "未填写")
GUICtrlCreateInput(IniRead($IniFeil, $Address[$i], "服务器名", "未填写"), 10, 40 + $i * 30, 130, 20, 0x00800881)
GUICtrlCreateInput($Ip[$i], 180, 40 + $i * 30, 130, 20, 0x00800881)
GUICtrlCreateInput($Port[$i], 360, 40 + $i * 30, 70, 20, 0x00800881)
$Status[$i] = GUICtrlCreateInput("未检测", 470, 40 + $i * 30, 100, 20, 0x00800881)
$Timer[$i] = _Timer_SetTimer($form, 500 + $i * 100);顺序检测,时间自己调整,单位为毫秒
;$Timer[$i] = _Timer_SetTimer($form, 1000);同时检查,一秒检查一次,单位为毫秒
Next
GUICtrlCreateInput(@ComputerName, 30, 270, 100, 20, 0x00800881)
GUICtrlCreateInput(@IPAddress1, 210, 270, 100, 20, 0x00800881)
GUICtrlCreateInput(@IPAddress2, 380, 270, 100, 20, 0x00800881)
GUISetState()
GUIRegisterMsg(0x0113, "WM_TIMER")
;AdlibRegister("Check_TCP_PORT", 1000) ;一秒检查一次
While Sleep(1e8)
WEnd
Func WM_TIMER($hWnd, $Msg, $wParam, $lParam)
Local $TimerID = _Timer_GetTimerID($wParam)
For $i = 0 To 6
Switch $TimerID
Case $Timer[$i]
Check_TCP_PORT($i)
EndSwitch
Next
Return "GUI_RUNDEFMSG"
EndFunc ;==>WM_TIMER
;===========检查TCP端口是否打开================
Func Check_TCP_PORT($x)
;If $x = 7 Then $x = 0
If StringRegExp($Ip[$x], "((2\d|25|?\d\d?)\.){3}(2\d|25|?\d\d?)") And _
StringRegExp($Port[$x], "^(||||)$") Then
;使用正则检测IP是否规范,端口是否在1-65535
GUICtrlSetData($Status[$x], "检测中...")
$Socket = TCPConnect($Ip[$x], $Port[$x])
If $Socket = -1 Then
Ping($Ip[$x])
Switch @error
Case 0
GUICtrlSetData($Status[$x], "端口不正确")
Case 1
GUICtrlSetData($Status[$x], "无法连接端口")
Case 2
GUICtrlSetData($Status[$x], "网络不可达")
Case 3
GUICtrlSetData($Status[$x], "错误目的地")
Case 4
GUICtrlSetData($Status[$x], "未知错误")
EndSwitch
Else
GUICtrlSetData($Status[$x], "网络正常")
TCPCloseSocket($Socket);关闭现有的Socket连接
EndIf
Else
If $Ip[$x] <> "未填写" Or $Port[$x] <> "未填写" Or Not ($Ip[$x]) Or Not ($Port[$x]) Then GUICtrlSetData($Status[$x], "ip或端口不规范")
EndIf
;$x += 1
EndFunc ;==>Check_TCP_PORT
Func GuiEvent()
Switch @GUI_CtrlId
Case -3
_Timer_KillAllTimers($form)
TCPShutdown()
Exit
EndSwitch
EndFunc ;==>GuiEvent
现在的问题在于TCP连接超时会引起线程阻塞,即TCPConnect连接至指定的IP(不是端口)失败时会导致GUI假死.此问题官方说会在下个版本解决. 哦,谢谢了。
不过我想问个问题。以上代码,最多只能监控7台主机。例如我这个脚本想给朋友用,我不知道他有多少台主机,有可能多于7台。这个时候要怎么改代码呢?请您给个思路,代码我自己来。我想赋予这个脚本更高的扩展性。
再次表示感谢。
我稍微修改了一下您的代码。在“网络不可达”时显示红色字体并蜂鸣警告。TCPStartup()
GUISetOnEvent(-3, "GuiEvent")
GUICtrlCreateLabel("服务器名", 50, 20, 50, 20)
GUICtrlCreateLabel("IP地址", 220, 20, 50, 20)
GUICtrlCreateLabel("端口", 380, 20, 30, 20)
GUICtrlCreateLabel("网络状态", 480, 20, 50, 20)
Local $Address = ["服务器地址", "服务器地址1", "服务器地址2", "服务器地址3", "服务器地址4", "服务器地址5", "服务器地址6"]
Global $Ip, $Port, $Status
Global $x = 0
For $i = 0 To 6
$Ip[$i] = IniRead($IniFeil, $Address[$i], "IP地址", "未填写")
$Port[$i] = IniRead($IniFeil, $Address[$i], "端口", "未填写")
GUICtrlCreateInput(IniRead($IniFeil, $Address[$i], "服务器名", "未填写"), 10, 40 + $i * 30, 130, 20, 0x00800881)
GUICtrlCreateInput($Ip[$i], 180, 40 + $i * 30, 130, 20, 0x00800881)
GUICtrlCreateInput($Port[$i], 360, 40 + $i * 30, 70, 20, 0x00800881)
$Status[$i] = GUICtrlCreateInput("未检测", 470, 40 + $i * 30, 100, 20, 0x00800881)
Next
GUICtrlCreateInput(@ComputerName, 30, 270, 100, 20, 0x00800881)
GUICtrlCreateInput(@IPAddress1, 210, 270, 100, 20, 0x00800881)
GUICtrlCreateInput(@IPAddress2, 380, 270, 100, 20, 0x00800881)
GUISetState()
AdlibRegister("Check_TCP_PORT", 1000) ;一秒检查一次
While Sleep(1e8)
WEnd
;===========检查TCP端口是否打开================
Func Check_TCP_PORT()
If $x = 7 Then $x = 0
If StringRegExp($Ip[$x], "((2\d|25|?\d\d?)\.){3}(2\d|25|?\d\d?)") And _
StringRegExp($Port[$x], "^(||||)$") Then
;使用正则检测IP是否规范,端口是否在1-65535
GUICtrlSetData($Status[$x], "检测中...")
GUICtrlSetColor($Status[$x],0x0D0D0D )
$Socket = TCPConnect($Ip[$x], $Port[$x])
If $Socket = -1 Then
Ping($Ip[$x])
Switch @error
Case 0 To 4
GUICtrlSetData($Status[$x], "网络不可达")
GUICtrlSetColor($Status[$x], 0xff0000)
_exit()
EndSwitch
Else
GUICtrlSetData($Status[$x], "网络正常")
TCPCloseSocket($Socket);关闭现有的wsa连接
EndIf
Else
If $Ip[$x] <> "未填写" Or $Port[$x] <> "未填写" Or Not ($Ip[$x]) Or Not ($Port[$x]) Then GUICtrlSetData($Status[$x], "ip或端口不规范")
EndIf
$x += 1
EndFunc ;==>Check_TCP_PORT
Func GuiEvent()
Switch @GUI_CtrlId
Case -3
TCPShutdown()
Exit
EndSwitch
EndFunc ;==>GuiEvent
Func _exit()
Beep(500, 3000)
EndFunc
研究一下.... 那就用listview或者只显示无法连接的服务器
页:
[1]