bingxing8000 发表于 2011-2-23 17:21:16

代码求简化

本帖最后由 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

m765555 发表于 2011-2-23 18:07:30

配置文件不发出来怎么看呢?

ceoguang 发表于 2011-2-23 21:57:05

本帖最后由 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

bingxing8000 发表于 2011-2-24 08:31:44

膜拜,膜拜~!!
再次被您的技术折服。
谢谢您的无私帮助。

bingxing8000 发表于 2011-2-24 08:47:20

可惜不能多线程

ceoguang 发表于 2011-2-24 11:16:24

回复 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假死.此问题官方说会在下个版本解决.

bingxing8000 发表于 2011-2-24 17:44:02

哦,谢谢了。
不过我想问个问题。以上代码,最多只能监控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

lxz 发表于 2011-2-24 17:52:44

研究一下....

ceoguang 发表于 2011-2-24 17:55:48

那就用listview或者只显示无法连接的服务器
页: [1]
查看完整版本: 代码求简化