最新vb.net 枚举电脑上的TCP,UDP连接
以下是三零网为大家整理的最新vb.net 枚举电脑上的TCP,UDP连接的文章,希望大家能够喜欢!
本来不想用API来实现的,因为VB.net里面封装了很多东西,微软也不提倡我们调用API。但我直接用VB.net提供的类和方法,我不知道怎么获取系统当前的TCP连接信息,比如对应的端口,对应的IP,对应的进程等等。C语言和易语言都是调用API实现的。下面用VB.NET2008来实现(代码有点笨,请别见外)。
API申明部分:
Declare Auto Function htons Lib "ws2_32.dll" Alias "htons" (ByVal PORT As Integer) As Integer Declare Auto Function GetProcessHeap Lib "Kernel32.dll" Alias "GetProcessHeap" () As Integer Declare Auto Function AllocateAndGetTcpExTableFromStack Lib "Iphlpapi.dll" Alias "AllocateAndGetTcpExTableFromStack" (ByRef TcpTable As IntPtr, ByVal bOrder As Integer, ByVal Heap As Integer, ByVal Flags As Integer, ByVal Flags2 As Integer) As Integer Declare Auto Function AllocateAndGetTcpExTableFromStack_ Lib "Iphlpapi.dll" Alias "AllocateAndGetTcpExTableFromStack" (ByRef TcpTable As Byte(), ByVal bOrder As Integer, ByVal Heap As Integer, ByVal Flags As Integer, ByVal Flags2 As Integer) As Integer Declare Auto Function AllocateAndGetUdpExTableFromStack Lib "Iphlpapi.dll" Alias "AllocateAndGetUdpExTableFromStack" (ByRef TcpTable As IntPtr, ByVal bOrder As Integer, ByVal Heap As Integer, ByVal Flags As Integer, ByVal Flags2 As Integer) As Integer Declare Auto Function AllocateAndGetUdpExTableFromStack_ Lib "Iphlpapi.dll" Alias "AllocateAndGetUdpExTableFromStack" (ByRef TcpTable As Byte(), ByVal bOrder As Integer, ByVal Heap As Integer, ByVal Flags As Integer, ByVal Flags2 As Integer) As Intege |
数据结构部分:
Public Structure MIB_TCPEXROW Public dwState As Int32 Public dwLocalAddr As Int32 Public dwLocalPort As Int32 Public dwRemoteAddr As Int32 Public dwRemotePort As Int32 Public dwProcessPID As Int32 End Structure Public Structure MIB_UDPEXROW Public dwLocalAddr As Int32 Public dwLocalPort As Int32 Public dwProcessPID As Int32 End Structure |
代码部分 :
Private Function getIP_(ByVal IP As Integer) As String Dim ret() As Byte = BitConverter.GetBytes(IP) getIP_ = CStr(ret(0)) + "." + CStr(ret(1)) + "." + CStr(ret(2)) + "." + CStr(ret(3)) End Function Private Function getState_(ByVal state As Integer) As String Select Case (state) Case 1 getState_ = "Closed" Case 2 getState_ = "Listening" Case 3 getState_ = "SYN_Sent" Case 4 getState_ = "SYN_Rcvd" Case 5 getState_ = "ESTAB" Case 6 getState_ = "FIN_Wait1" Case 7 getState_ = "FIN_Wait2" Case 8 getState_ = "Close_Wait" Case 9 getState_ = "Closing" Case 10 getState_ = "Last_Ack" Case 11 getState_ = "Time_Wait" Case 12 getState_ = "Delete_TCB" Case Else getState_ = "未知" End Select End Function Private Function MainFunction() Dim temp_() As Byte '当做第一层指针,是为了获取连接数量 Dim temp As IntPtr = IntPtr.Zero 'temp第二层指针 Dim size_ As Integer '储存连接数量 Dim size2 As Integer = System.Runtime.InteropServices.Marshal.SizeOf(GetType(MIB_TCPEXROW)) '获取结构的大小 AllocateAndGetTcpExTableFromStack_(temp_, 1, GetProcessHeap(), 2, 2) AllocateAndGetTcpExTableFromStack(temp, 1, GetProcessHeap(), 2, 2) size_ = temp_(0) '字节数据的第一个元素的值储存的是TCP连接的数量,求UDP时雷同 Dim i As Integer Dim tcp As MIB_TCPEXROW For i = 0 To size_ - 1 Step 1 tcp = New MIB_TCPEXROW With tcp .dwLocalAddr = 0 .dwLocalPort = 0 .dwProcessPID = 0 .dwRemoteAddr = 0 .dwRemotePort = 0 .dwState = 0 End With tcp = CType(System.Runtime.InteropServices.Marshal.PtrToStructure(New IntPtr(temp.ToInt32 + 4 + i * size2), GetType(MIB_TCPEXROW)), MIB_TCPEXROW) MessageBox.Show("进程ID" + CStr(tcp.dwProcessPID)) MessageBox.Show("本地IP" + getIP_(tcp.dwLocalAddr)) MessageBox.Show("本地端口" + CStr(htons(tcp.dwLocalPort))) MessageBox.Show("外网IP" + getIP_(tcp.dwRemoteAddr)) MessageBox.Show("外网端口" + CStr(htons(tcp.dwRemotePort))) MessageBox.Show("连接状态" + getState_(tcp.dwState)) Next '************************************UDP temp = IntPtr.Zero size2 = System.Runtime.InteropServices.Marshal.SizeOf(GetType(MIB_UDPEXROW)) AllocateAndGetUdpExTableFromStack_(temp_, 1, GetProcessHeap(), 2, 2) AllocateAndGetUdpExTableFromStack(temp, 1, GetProcessHeap(), 2, 2) size_ = temp_(0) Dim udp As MIB_UDPEXROW For i = 0 To size_ - 1 Step 1 udp = New MIB_UDPEXROW With udp .dwLocalAddr = 0 .dwLocalPort = 0 .dwProcessPID = 0 End With udp = CType(System.Runtime.InteropServices.Marshal.PtrToStructure(New IntPtr(temp.ToInt32 + 4 + i * size2), GetType(MIB_UDPEXROW)), MIB_UDPEXROW) MessageBox.Show("进程ID" + CStr(udp.dwProcessPID)) MessageBox.Show("本地IP" + getIP_(udp.dwLocalAddr)) MessageBox.Show("本地端口" + CStr(htons(udp.dwLocalPort))) Next End Function |
联系客服