zoukankan      html  css  js  c++  java
  • windows获取进程端口

    1. TCP端口

     

    函数

      DWORD GetExtendedTcpTable(
              PVOID pTcpTable,
              PDWORD pdwSize,
              BOOL bOrder,
              ULONG ulAf,
              TCP_TABLE_CLASS TableClass,
              ULONG Reserved
      );


    功能

      获取当前所有TCP端口的列表


    参数

      PVOID pTcpTable:接收缓冲区,接收返回的TCP端口列表,表类型由参数TableClass决定

      PDWORD pdwSize:pTcpTable缓冲区字节数,若缓冲区过小则返回所需大小

      BOOL bOrder:端口列表是否排序

      ULONG ulAf:AF_INET表IPv4,AF_INET6表IPv6

      TCP_TABLE_CLASS TableClass:类型TCP_TABLE_CLASS的枚举值,指定TCP_TABLE_OWNER_PID_ALL即可

      ULONG Reserved:0

    指定Table类型为TCP_TABLE_OWNER_PID_ALL,则获取到的TCP Table类型为MIB_TCPTABLE_OWNER_PID结构体

    typedef struct {
      DWORD                dwNumEntries;
      MIB_TCPROW_OWNER_PID table[ANY_SIZE];
    } MIB_TCPTABLE_OWNER_PID, *PMIB_TCPTABLE_OWNER_PID;
    
    typedef struct _MIB_TCPROW_OWNER_PID {
      DWORD dwState;
      DWORD dwLocalAddr;
      DWORD dwLocalPort;
      DWORD dwRemoteAddr;
      DWORD dwRemotePort;
      DWORD dwOwningPid;
    } MIB_TCPROW_OWNER_PID, *PMIB_TCPROW_OWNER_PID;

    返回值

     成功返回NO_ERROR,否则返回值即错误码


    使用方法

    	#include <IPHlpApi.h>
    	#pragma comment(lib, "IPHlpApi.lib")
    
    	/*获取缓冲区大小*/
    	DWORD dwBufferSize = 0;
    	GetExtendedTcpTable(NULL, &dwBufferSize, true, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
    
    	/*创建缓冲区*/
    	MIB_TCPTABLE_OWNER_PID *pMibTcpTable = (MIB_TCPTABLE_OWNER_PID*)malloc(dwBufferSize);
    
    	/*取Tcp Table*/
    	DWORD dwRet = GetExtendedTcpTable(pMibTcpTable, &dwBufferSize, true, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
    	if(dwRet != NO_ERROR)
    	{
    		printf("GetExtendedTcpTable != ERROR_SUCCESS, ErrorCode=%d
    ", dwRet);
    		free(pMibTcpTable);
    		return false;
    	}

    结果

    	for(DWORD i = 0; i != pMibTcpTable->dwNumEntries; ++i)
    	{
    		/*获取端口状态*/
    		DWORD dwState = pMibTcpTable->table[i].dwState;
    
    		/*生成IP*/
    		in_addr inAddrLocal, inAddrRemote;
    		memcpy(&inAddrLocal, &(pMibTcpTable->table[i].dwLocalAddr), sizeof(DWORD));
    		memcpy(&inAddrRemote, &(pMibTcpTable->table[i].dwRemoteAddr), sizeof(DWORD));
    		std::string sIpLocal = inet_ntoa(inAddrLocal);
    		std::string sIpRemote = inet_ntoa(inAddrRemote);
    
    		/*获取Port*/
    		DWORD dwPortLocal = ntohs(pMibTcpTable->table[i].dwLocalPort);
    		DWORD dwPortRemote = ntohs(pMibTcpTable->table[i].dwRemotePort);
    
    		/*获取PID*/
    		DWORD dwPid = pMibTcpTable->table[i].dwOwningPid;
    
    		printf("端口状态=%d, 本地地址=%s, 本地端口=%d, 远端地址=%s, 远端端口=%d, 进程号=%d
    ", 
    			dwState, sIpLocal.c_str(), dwPortLocal, sIpRemote.c_str(), dwPortRemote, dwPid);
    	}
    

     

    2. UDP端口

     

    函数

      DWORD GetExtendedUdpTable(
           PVOID pUdpTable,
           PDWORD pdwSize,
           BOOL bOrder,
           ULONG ulAf,
           UDP_TABLE_CLASS TableClass,
           ULONG Reserved
      );

    功能

      获取当前所有UDP端口的列表


    参数

      同上

      UDP_TABLE_CLASS TableClass:类型UDP_TABLE_CLASS的枚举值,指定UDP_TABLE_OWNER_PID即可。

    指定Table类型为UDP_TABLE_OWNER_PID,则获取到的UDP Table类型为MIB_UDPTABLE_OWNER_PID结构体

    typedef struct _MIB_UDPTABLE_OWNER_PID {
      DWORD                dwNumEntries;
      MIB_UDPROW_OWNER_PID table[ANY_SIZE];
    } MIB_UDPTABLE_OWNER_PID, *PMIB_UDPTABLE_OWNER_PID;
    
    typedef struct _MIB_UDPROW_OWNER_PID {
      DWORD dwLocalAddr;
      DWORD dwLocalPort;
      DWORD dwOwningPid;
    } MIB_UDPROW_OWNER_PID, *PMIB_UDPROW_OWNER_PID;

    返回值

     成功返回NO_ERROR,否则返回值即错误码


    使用方法

    #include <IPHlpApi.h>
    #pragma comment(lib, "IPHlpApi.lib")
    
    /*获取缓冲区大小*/  
    DWORD dwBufferSize = 0;
    GetExtendedUdpTable(NULL, &dwBufferSize, true, AF_INET, UDP_TABLE_OWNER_PID, 0);  
      
    /*创建缓冲区*/  
    MIB_UDPTABLE_OWNER_PID *pMibUdpTable = (MIB_UDPTABLE_OWNER_PID*)malloc(dwBufferSize);  
      
    /*取Udp Table*/  
    DWORD dwRet = GetExtendedUdpTable(pMibUdpTable, &dwBufferSize, true, AF_INET, UDP_TABLE_OWNER_PID, 0);  
    if(dwRet != NO_ERROR)  
    {  
        printf("GetExtendedUdpTable != ERROR_SUCCESS, ErrorCode=%d
    ", dwRet);
    	free(pMibUdpTable);
        return false;  
    }

    结果

    	for(DWORD i = 0; i != pMibUdpTable->dwNumEntries; ++i)
    	{
    		/*获取IP*/
    		in_addr inAddrLocal;
    		memcpy(&inAddrLocal, &(pMibUdpTable->table[i].dwLocalAddr), sizeof(DWORD));
    		std::string sIpLocal = inet_ntoa(inAddrLocal);
    
    		/*获取Port*/
    		DWORD dwPortLocal = ntohs(pMibUdpTable->table[i].dwLocalPort);
    
    		/*获取PID*/
    		DWORD dwPid = pMibUdpTable->table[i].dwOwningPid;
    
    		printf("本地地址=%s, 本地端口=%d, 进程号=%d
    ", sIpLocal.c_str(), dwPortLocal, dwPid);
    	}


    3. 进程句柄、进程名PID转换

     

    进程句柄——>PID

    DWORD GetProcessId(HANDLE hProcess) ;

    进程名——>进程句柄

    HANDLE GetProcessHandle(const std::string &sNameProc)
    {
    	/*获取进程快照句柄*/
    	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
    	/*遍历进程*/
    	PROCESSENTRY32 pe32;
    	pe32.dwSize = sizeof(pe32);
    	BOOL bMore = Process32First(hProcessSnap, &pe32);
    	while(bMore)
    	{
    		if(!sNameProc.compare(pe32.szExeFile))
    		{
    			HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
    			return hProcess;
    		}
    		bMore = ::Process32Next(hProcessSnap, &pe32);
    	}
    
    	/*进程不存在*/
    	printf("GetProcessHandle: sNameProc=%s Not Exist", sNameProc.c_str());
    	return INVALID_HANDLE_VALUE;
    }


    进程名——>PID

    bool GetPidFromProcName(const std::string &sNameProc, std::set<DWORD> &setPid)
    {
    	/*获取进程快照*/
    	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
    	/*遍历进程*/
    	PROCESSENTRY32 pe32;
    	pe32.dwSize = sizeof(pe32);
    	BOOL bMore = Process32First(hProcessSnap, &pe32);
    	while(bMore)
    	{
    		if(!sNameProc.compare(pe32.szExeFile))
    			setPid.insert(pe32.th32ProcessID);
    		bMore=::Process32Next(hProcessSnap,&pe32);
    	}
    
    	return true;
    }

    系统允许进程名重复。

     

    PID——>进程名

    bool GetProcNameByPid(const DWORD dwPid, std::string &sNameProc)
    {
    	/*获取进程快照句柄*/
    	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
    	/*遍历进程*/
    	PROCESSENTRY32 pe32;
    	pe32.dwSize = sizeof(pe32);
    	bool bMore = Process32First(hProcessSnap, &pe32);
    	while(bMore)
    	{
    		if(pe32.th32ProcessID == dwPid)
    		{
    			sNameProc = pe32.szExeFile;
    			return true;
    		}
    		bMore=::Process32Next(hProcessSnap, &pe32);
    	}
    
    	/*进程不存在*/
    	return false;
    }


  • 相关阅读:
    Centos7 关闭防火墙
    Linux下磁盘挂载
    Sqlserver游标复习
    Redis-benchmark测试Redis性能
    将treeview控件内容导出图片
    使用redis进行消息推送
    web性能优化系列之网站瓶颈识别
    SqlServer时间格式化
    PHP二位数组/多维数组 根据某个键值排序
    VIM Taglist + ctags
  • 原文地址:https://www.cnblogs.com/chaikefusibushiji/p/6775763.html
Copyright © 2011-2022 走看看