进程PID(Process ID) 与 端口号(Port ID)

1.首先声明一点:PID不是端口(port id),而是Process lD进程号的意思。

2.那么,什么是进程号?
采集网友的意见就是:
进程号,是系统分配给么一个进程的唯一标识符。PID就是各进程的身份标识符,程序一运行系统就会自动分配给进程一个独一无二的PID。进程终止后,PID被系统回收,可能会被继续给新运行的程序。

3.深入理解二者关系:
—个程序一个端口;
一个端口可以有多个进程;
(顺便提一下:一个进程可以有多个线程(将一个进程的系统资源共享给一个程序内多道分程序,并行运行,以达到节约CPU资源等目的))
—般地,一个程序对应一个进程。
—般地,浏览器多个进程,其他程序一个进程。

4.windows系统中怎么查看PID与端口号?
查看PID:
ans1.cmd>netstat -anoans2.cmd>tasklist
ans2.ctrl+shift+esc(任务管理器)>服务查看PID与端口:
ans1: cmd>netstat -ano

5.总结:
一个网络应用程序对应一个端口;

一个端口对应一至多个进程;

一个进程对应一至多个线程;
 

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 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 连接,从而得到端口号
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值