Linux——根据pid获取端口号

在linux一般使用netstat 来查看系统端口使用情况步。

netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的

netstat命令的功能是显示网络连接、路由表和网络接口信息,可以让用户得知目前都有哪些网络连接正在运作。

该命令的一般格式为:

  netstat [选项]


  命令中各选项的含义如下:


  -a 显示所有socket,包括正在监听的。


  -c 每隔1秒就重新显示一遍,直到用户中断它。


  -i 显示所有网络接口的信息,格式同“ifconfig -e”。


  -n 以网络IP地址代替名称,显示出网络连接情形。


  -r 显示核心路由表,格式同“route -e”。


  -t 显示TCP协议的连接情况。


  -u 显示UDP协议的连接情况。


  -v 显示正在进行的工作。

一个进程很有可能对应多个端口

netstat -anopt |grep 18676 |head -n 1|awk '{print $4}' |cut -d: -f4

一个进程很有可能对应多个端口 这里只获取获取四位的端口

netstat -anopt |grep 18676 |grep LISTEN|awk '{print $4}'|rev|cut -d: -f 1|grep -E '^[0-9]{4}'|rev

一些使用实例:

1. netstat -an | grep LISTEN
      0.0.0.0的就是每个IP都有的服务,写明哪个IP的就是绑定那个IP的服务。
 
2. netstat -tln
      用来查看linux的端口使用情况
 
3. /etc/init.d/vsftp start
      是用来启动ftp端口~
 
4. netstat
      查看已经连接的服务端口(ESTABLISHED)
 
5. netstat -a
      查看所有的服务端口(LISTEN,ESTABLISHED)
 
6. sudo netstat -ap
      查看所有的服务端口并显示对应的服务程序名
 
7.查看某个端口的连接数
   netstat -nat|grep -i "80"|wc -l

参考博文:
https://blog.csdn.net/weixin_42167759/article/details/84526313

在 Windows 操作系统中,可以使用 WMI 获取进程的详细信息,包括 PID端口号。以下是一个示例代码,根据进程的 PID 获取端口号: ```csharp using System; using System.Management; class Program { static void Main(string[] args) { // 要询的进程 PID int pid = 1234; // 使用 WMI 获取进程的详细信息 ManagementObjectSearcher searcher = new ManagementObjectSearcher( "SELECT * FROM Win32_Process WHERE ProcessId = " + pid); ManagementObjectCollection results = searcher.Get(); // 遍历询结果,获取端口号 foreach (ManagementObject result in results) { // 获取进程的句柄 uint processId = (uint)result["ProcessId"]; IntPtr handle = NativeMethods.OpenProcess( NativeMethods.PROCESS_QUERY_INFORMATION | NativeMethods.PROCESS_VM_READ, false, (int)processId); // 获取进程的模块信息 NativeMethods.EnumProcessModules(handle, out IntPtr moduleHandle, sizeof(IntPtr), out uint neededSize); string moduleName = new string(' ', 1024); NativeMethods.GetModuleFileNameEx(handle, moduleHandle, moduleName, (uint)moduleName.Length); // 获取进程监听的端口号 TcpTable tcpTable = new TcpTable(); uint tcpTableLength = (uint)Marshal.SizeOf(tcpTable); NativeMethods.GetExtendedTcpTable(tcpTable, ref tcpTableLength, true, NativeMethods.AF_INET, NativeMethods.TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL); foreach (TcpRow row in tcpTable.rows) { if (row.owningPid == pid && row.state == TcpState.Listen) { Console.WriteLine("Process {0} listens on port {1}", moduleName, row.localPort); } } // 关闭进程句柄 NativeMethods.CloseHandle(handle); } } } class NativeMethods { public const uint PROCESS_QUERY_INFORMATION = 0x0400; public const uint PROCESS_VM_READ = 0x0010; public const int AF_INET = 2; [DllImport("kernel32.dll", SetLastError = true)] public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId); [DllImport("psapi.dll", SetLastError = true)] public static extern bool EnumProcessModules(IntPtr hProcess, out IntPtr lphModule, int cb, out uint lpcbNeeded); [DllImport("psapi.dll", CharSet = CharSet.Unicode)] public static extern uint GetModuleFileNameEx(IntPtr hProcess, IntPtr hModule, [Out] StringBuilder lpBaseName, uint nSize); [DllImport("iphlpapi.dll", SetLastError = true)] public static extern int GetExtendedTcpTable(IntPtr pTcpTable, ref uint pdwSize, bool bOrder, int ulAf, TCP_TABLE_CLASS TableClass, uint Reserved = 0); [DllImport("kernel32.dll", SetLastError = true)] public static extern bool CloseHandle(IntPtr hObject); public 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 } [StructLayout(LayoutKind.Sequential)] public struct MIB_TCPROW_OWNER_PID { public uint state; public uint localAddr; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] localPort; public uint remoteAddr; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] remotePort; public uint owningPid; } [StructLayout(LayoutKind.Sequential)] public struct TcpTable { public uint rowsCount; public MIB_TCPROW_OWNER_PID[] rows; } public enum TcpState { Closed = 1, Listen = 2, SynSent = 3, SynReceived = 4, Established = 5, FinWait1 = 6, FinWait2 = 7, CloseWait = 8, Closing = 9, LastAck = 10, TimeWait = 11, DeleteTcb = 12 } [StructLayout(LayoutKind.Sequential)] public struct TcpRow { public uint state; public uint localAddr; public uint localPort; public uint remoteAddr; public uint remotePort; public uint owningPid; } } ``` 在上面的代码中,我们首先定义了要询的进程 PID,然后使用 WMI 获取进程的详细信息。接着遍历询结果,获取进程的模块信息和监听的端口号。具体实现过程中使用了一些 Windows API 函数和结构体,如 OpenProcess、EnumProcessModules、GetModuleFileNameEx、GetExtendedTcpTable 等。获取端口号的核心代码是调用 GetExtendedTcpTable 函数获取进程的 TCP 连接信息,然后从中筛选出监听中的 TCP 连接,从而得到端口号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值