找回密码
 加入
搜索
查看: 4758|回复: 10

[网络通信] 如何监控一个端口的状态

  [复制链接]
发表于 2010-11-14 11:13:10 | 显示全部楼层 |阅读模式
比如监控 2948 端口的状态是否为ESTABLISHED
发表于 2010-11-14 11:24:21 | 显示全部楼层
_WinAPI_GetTCPTable
 楼主| 发表于 2010-11-14 11:29:32 | 显示全部楼层
可不可以给个示例啊...
发表于 2010-11-14 11:33:02 | 显示全部楼层
汉化的udf里有例子
 楼主| 发表于 2010-11-14 11:37:35 | 显示全部楼层
是哪个版本的,我的3.3.6.1里没有这个函数..
发表于 2010-11-14 11:38:16 | 显示全部楼层
说了,汉化的udf里
 楼主| 发表于 2010-11-14 11:43:35 | 显示全部楼层
下载了那个汉化的UDF,依然没找到,郁闷...
 楼主| 发表于 2010-11-14 11:51:41 | 显示全部楼层
帮帮忙哦...
发表于 2010-11-14 12:30:59 | 显示全部楼层
发表于 2010-11-14 13:06:41 | 显示全部楼层
以前在论坛收集的,你看看,希望对你有帮助
#include <GUIConstants.au3>
#include <GuiListView.au3>
#include <file.au3>

Local $DataArray,$Data[9]
$AForm1 = GUICreate("本机开放端口查看", 730, 400, -1, -1)
$Listview1 = GUICtrlCreateListView("协议| 本地主机       |本地端口  | 远程主机       | 远程端口 | 连接状态 |进程", 0, 0, 730, 400)
GUICtrlSendMsg($Listview1, 0x101E, 6, 259)
GUICtrlSendMsg(-1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
$Menu = GUICtrlCreateContextMenu($Listview1)
$Menu1 = GUICtrlCreateMenuItem("刷新", $Menu)
GUISetState(@SW_SHOW)
_ReNetstat()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Menu1
            _ReNetstat()
    EndSwitch
WEnd

Func _ReNetstat($LoReIP = True, $LoReIP1 = True)
    GUICtrlSendMsg($Listview1, $LVM_DeleteALLITEMS, 0, 0)
    RunWait(@ComSpec & ' /c netstat -ano > ' & @TempDir & '\NetSOT.tmp', "", @SW_HIDE)
    If _FileReadToArray(@TempDir & '\NetSOT.tmp', $DataArray) <> 0 Then
        For $I = 5 To $DataArray[0] - 1
            $StatColor = 1
            $Data[0] = StringReplace(StringMid($DataArray[$I], 1, 9), " ", "")
            $Data[1] = StringReplace(StringMid($DataArray[$I], 10, 23), " ", "")
            $Prot = StringSplit($Data[1], ":")
            If $Prot[0] = 1 Then ExitLoop
            $Data[1] = $Prot[1]  ;
            If $LoReIP = False Then
                If $Data[1] = "127.0.0.1" Then ContinueLoop
            EndIf
            If $LoReIP1 = False Then
                If $Data[1] = "0.0.0.0" Then ContinueLoop
            EndIf
            $Data[2] = $Prot[2] ;
            $Data[3] = StringReplace(StringReplace(StringMid($DataArray[$I], 33, 23), " ", ""), "*:*", "0.0.0.0:0");data2
            $Prot = StringSplit($Data[3], ":")
            If $Prot[0] = 1 Then
                $Data[3] = ""  ;
                $Data[4] = "" ;
            Else
                $Data[3] = $Prot[1]  ;
                $Data[4] = $Prot[2] ;
            EndIf
            $Data[5] = StringReplace(StringMid($DataArray[$I], 56, 16), " ", "")
            If $Data[5] = "" Then
                $Data[5] = "侦听"
                $StatColor = 0
            Else
                $Data[5] = StringReplace(StringReplace(StringReplace(StringReplace($Data[5], "TIME_WAIT", "连接结束"), "LISTENING", "侦听"), "ESTABLISHED", "已连接"), "CLOSE_WAIT", "正在关闭");data3
            EndIf
            $Data[6] = StringReplace(StringMid($DataArray[$I], 72, 10), " ", "");data4
            $list = ProcessList()
            For $J = 1 To $list[0][0]
                If $list[$J][1] = $Data[6] Then
                    $Path = "System"
                    If $Data[6] = 0 Then
                        $Path = "System"
                    Else
                        If $list[$J][0] <> "System" Then
                            $Path = _Processpath($Data[6])
                            If $Path = "" Then $Path = $list[$J][0]
                        EndIf
                    EndIf
                    $DisplayT = GUICtrlCreateListViewItem($Data[0] & "|" & $Data[1] & "|" & $Data[2] & "|" & $Data[3] & "|" & $Data[4] & "|" & $Data[5] & "|" & $Path, $Listview1)
                    If $StatColor = 1 Then GUICtrlSetBkColor(-1, 0xFFFED8)
                EndIf
            Next
        Next
    EndIf
    FileDelete(@TempDir & "\NetSOT.tmp")
EndFunc   ;==>_ReNetstat

Func _Processpath($iPID)
    Local $aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $iPID)
    If $aProc[0] = 0 Then Return SetError(1, 0, '')
    Local $vStruct = DllStructCreate('int[1024]')
    DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc[0], 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)
    Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc[0], 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)
    If StringLen($aReturn[3]) = 0 Then Return SetError(2, 0, '')
    Return $aReturn[3]
EndFunc   ;==>_Processpath
发表于 2010-11-14 13:10:50 | 显示全部楼层
本帖最后由 lpxx 于 2010-11-14 13:15 编辑

你也可以参考蛋总汉化的UDF,
关于_WinAPI_GetTCPTable用法,你可以参考以下,现在的人真懒。
_WinAPI_GetTCPTable

获取IPv4 TCP端口的连接状态


#Include <WinAPIEx.au3>
_WinAPI_GetTCPTable()

参数

无.
返回值

成功: 包含下列元素的二维数组:
[0][0] - 元素数量
[n][0] - 连接状态:
1 - 无TCP连接
2 - TCP连接处于监听等待状态
3 - 已发送一个SYN包
4 - 已接收一个SYN包
5 - TCP连接已建立
6 - TCP连接正在等待一个FIN包
7 - TCP连接正在等待一个FIN包
8 - TCP连接处于结束等待状态
9 - TCP连接正在关闭
10 - TCP连接处于上次应答状态
11 - TCP连接处于等待状态
12 - TCP连接处于将被删除状态
[n][1] - 本地IP
[n][2] - 本地端口
[n][3] - 远程IP
[n][4] - 远程端口
失败: [0][0] = -1
示例:
#Include <Array.au3>
#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

Global $TCPtable = _WinApi_GetTCPtable()
_ArrayDisplay($TCPtable)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 09:34 , Processed in 0.079264 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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