using Azylee.Core.DataUtils.CollectionUtils; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Net; using System.Runtime.InteropServices; using System.Text; namespace Azylee.Core.NetUtils { public class NetProcessTool { #region 枚举 读取连接表选项 enum TCP_TABLE_CLASS { TCP_TABLE_BASIC_LISTENER, TCP_TABLE_BASIC_CONNECTIONS, TCP_TABLE_BASIC_ALL, TCP_TABLE_OWNER_PID_LISTENER, TCP_TABLE_OWNER_PID_CONNECTIONS, TCP_TABLE_OWNER_PID_ALL, TCP_TABLE_OWNER_MODULE_LISTENER, TCP_TABLE_OWNER_MODULE_CONNECTIONS, TCP_TABLE_OWNER_MODULE_ALL } enum UDP_TABLE_CLASS { UDP_TABLE_BASIC, UDP_TABLE_OWNER_PID, UDP_TABLE_OWNER_MODULE } #endregion #region UDP 和 TCP 列表 结构 struct UdpTable { public uint dwNumEntries; private UdpRow table; } struct TcpTable { public uint dwNumEntries; private TcpRow table; } #endregion #region UDP 和 TCP 行记录 结构 public struct UdpRow { private uint localAddr; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] private byte[] localPort; public IPAddress LocalIP { get { return new IPAddress((long)((ulong)this.localAddr)); } } public ushort LocalPort { get { return BitConverter.ToUInt16(new byte[] { this.localPort[1], this.localPort[0] }, 0); } } public int ProcessId { get; } } public struct TcpRow { private ConnectionState state; private uint localAddr; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] private byte[] localPort; private uint remoteAddr; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] private byte[] remotePort; public ConnectionState State { get { return state; } } public IPAddress LocalIP { get { return new IPAddress((long)((ulong)this.localAddr)); } } public ushort LocalPort { get { return BitConverter.ToUInt16(new byte[] { this.localPort[1], this.localPort[0] }, 0); } } public IPAddress RemoteIP { get { return new IPAddress((long)((ulong)this.remoteAddr)); } } public ushort RemotePort { get { return BitConverter.ToUInt16(new byte[] { this.remotePort[1], this.remotePort[0] }, 0); } } public int ProcessId { get; } } #endregion [DllImport("iphlpapi.dll", SetLastError = true)] static extern uint GetExtendedTcpTable(IntPtr pTcpTable, ref int dwOutBufLen, bool sort, int ipVersion, TCP_TABLE_CLASS tblClass, uint reserved = 0u); [DllImport("iphlpapi.dll", SetLastError = true)] static extern uint GetExtendedUdpTable(IntPtr pUdpTable, ref int dwOutBufLen, bool sort, int ipVersion, UDP_TABLE_CLASS tblClass, uint reserved = 0u); private static TcpRow[] GetTcpConnections() { TcpRow[] array = null; int ipVersion = 2; int cb = 0; uint extendedTcpTable = GetExtendedTcpTable(IntPtr.Zero, ref cb, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL, 0u); IntPtr intPtr = Marshal.AllocHGlobal(cb); try { extendedTcpTable = GetExtendedTcpTable(intPtr, ref cb, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL, 0u); bool flag = extendedTcpTable > 0u; if (flag) return null; TcpTable tcpTable = (TcpTable)Marshal.PtrToStructure(intPtr, typeof(TcpTable)); IntPtr intPtr2 = (IntPtr)((long)intPtr + Marshal.SizeOf(tcpTable.dwNumEntries)); array = new TcpRow[tcpTable.dwNumEntries]; int num = 0; while (num < (long)((ulong)tcpTable.dwNumEntries)) { TcpRow tcpRow = (TcpRow)Marshal.PtrToStructure(intPtr2, typeof(TcpRow)); array[num] = tcpRow; intPtr2 = (IntPtr)((long)intPtr2 + Marshal.SizeOf(tcpRow)); num++; } } catch (Exception) { } finally { Marshal.FreeHGlobal(intPtr); } return array; } private static UdpRow[] GetUdpConnections() { UdpRow[] array = null; int ipVersion = 2; int cb = 0; uint extendedUdpTable = GetExtendedUdpTable(IntPtr.Zero, ref cb, true, ipVersion, UDP_TABLE_CLASS.UDP_TABLE_OWNER_PID, 0u); IntPtr intPtr = Marshal.AllocHGlobal(cb); try { extendedUdpTable = GetExtendedUdpTable(intPtr, ref cb, true, ipVersion, UDP_TABLE_CLASS.UDP_TABLE_OWNER_PID, 0u); bool flag = extendedUdpTable > 0u; if (flag) return null; UdpTable udpTable = (UdpTable)Marshal.PtrToStructure(intPtr, typeof(UdpTable)); IntPtr intPtr2 = (IntPtr)((long)intPtr + Marshal.SizeOf(udpTable.dwNumEntries)); array = new UdpRow[udpTable.dwNumEntries]; int num = 0; while (num < (long)((ulong)udpTable.dwNumEntries)) { UdpRow udpRow = (UdpRow)Marshal.PtrToStructure(intPtr2, typeof(UdpRow)); array[num] = udpRow; intPtr2 = (IntPtr)((long)intPtr2 + Marshal.SizeOf(udpRow)); num++; } } catch (Exception) { } finally { Marshal.FreeHGlobal(intPtr); } return array; } /// /// 获取本机所有TCP连接 /// /// public static TcpRow[] GetTcps() { return GetTcpConnections(); } /// /// 获取本机所有UDP连接 /// /// public static UdpRow[] GetUdps() { return GetUdpConnections(); } #region 便捷方法 /// /// 根据端口号获取进程ID /// /// /// public static int GetPidByPort(int port) { try { TcpRow[] list = GetTcps(); if (Ls.Ok(list)) foreach (var item in list) if (item.LocalPort == port) return item.ProcessId; } catch { } try { UdpRow[] list = GetUdps(); if (Ls.Ok(list)) foreach (var item in list) if (item.LocalPort == port) return item.ProcessId; } catch { } return -1; } #endregion } }