portmap1.cpp

来自「这是一本学习 window编程的很好的参考教材」· C++ 代码 · 共 174 行

CPP
174
字号
#include <stdio.h>
#include <windows.h>
#include <iprtrmib.h>

#include <iphlpapi.h>

#pragma comment(lib, "ws2_32.lib")
#define HOSTNAMELEN 256
#define PORTNAMELEN 256
#define ADDRESSLEN HOSTNAMELEN+PORTNAMELEN
//结构定义
typedef struct tagMIB_TCPEXROW{
	DWORD dwState; // TCP连接状态
	DWORD dwLocalAddr; // 本地IP地址
	DWORD dwLocalPort; // 打开的本地端口
	DWORD dwRemoteAddr; // 远程IP地址
	DWORD dwRemotePort; // 远程端口号
	DWORD dwProcessId;  //进程标识
} MIB_TCPEXROW, *PMIB_TCPEXROW;

typedef struct tagMIB_TCPEXTABLE{
	DWORD dwNumEntries;
	MIB_TCPEXROW table[ANY_SIZE];
} MIB_TCPEXTABLE, *PMIB_TCPEXTABLE;

typedef struct tagMIB_UDPEXROW{
	DWORD dwLocalAddr; //本地IP地址
	DWORD dwLocalPort; //打开的本地端口
	DWORD dwProcessId; //进程标识
} MIB_UDPEXROW, *PMIB_UDPEXROW;

typedef struct tagMIB_UDPEXTABLE{
	DWORD dwNumEntries;
	MIB_UDPEXROW table[ANY_SIZE];
} MIB_UDPEXTABLE, *PMIB_UDPEXTABLE;

//函数声明:
typedef DWORD (WINAPI *PALLOCATE_AND_GET_TCPEXTABLE_FROM_STACK)(
				PMIB_TCPEXTABLE *pTcpTable, 
				BOOL bOrder, 
				HANDLE heap,
				DWORD zero,
				DWORD flags
				);
typedef DWORD (WINAPI *PALLOCATE_AND_GET_UDPEXTABLE_FROM_STACK) (
				PMIB_UDPEXTABLE *pUdpTable, 
				BOOL bOrder, HANDLE heap,
				DWORD zero,
				DWORD flags
				);
//定义函数事例入口指针,初始化为NULL
static PALLOCATE_AND_GET_TCPEXTABLE_FROM_STACK pAllocateAndGetTcpExTableFromStack = NULL;
static PALLOCATE_AND_GET_UDPEXTABLE_FROM_STACK pAllocateAndGetUdpExTableFromStack = NULL;

static char TcpState[][32] = {
					"???",
					"CLOSED",
					"LISTENING",
					"SYN_SENT",
					"SYN_RCVD",
					"ESTABLISHED",
					"FIN_WAIT1",
					"FIN_WAIT2",
					"CLOSE_WAIT",
					"CLOSING",
					"LAST_ACK",
					"TIME_WAIT",
					"DELETE_TCB"
};
//辅助函数
PCHAR GetPort(unsigned int port, char* pPort)
{
	sprintf(pPort, "%d", htons( (WORD) port));
	return pPort;
}

PCHAR GetIp(unsigned int ipaddr, char* pIP)
{
	unsigned int nipaddr;
	nipaddr = htonl(ipaddr);
	sprintf(pIP, "%d.%d.%d.%d", 
	(nipaddr >> 24) & 0xFF,
	(nipaddr >> 16) & 0xFF,
	(nipaddr >> 8) & 0xFF,
	(nipaddr) & 0xFF);
	return pIP;
}
//加载API函数
BOOL LoadAPI()
{
	pAllocateAndGetTcpExTableFromStack = (PALLOCATE_AND_GET_TCPEXTABLE_FROM_STACK) GetProcAddress( LoadLibrary( "iphlpapi.dll"), 
				"AllocateAndGetTcpExTableFromStack" );
	if( !pAllocateAndGetTcpExTableFromStack ) 
	return FALSE;
	pAllocateAndGetUdpExTableFromStack = (PALLOCATE_AND_GET_UDPEXTABLE_FROM_STACK) GetProcAddress( LoadLibrary( "iphlpapi.dll"), 
				"AllocateAndGetUdpExTableFromStack" );
	if( !pAllocateAndGetUdpExTableFromStack ) 
	return FALSE;
}

int main(int argc, char* argv[])
{
	int nRetCode;
	DWORD i;
	WSADATA WSAData;
	HANDLE hProcessSnap;
	PMIB_TCPEXTABLE TCPExTable;
	PMIB_UDPEXTABLE UDPExTable;
	char szProcessName[MAX_PATH];
	char szLocalName[HOSTNAMELEN], szRemoteName[HOSTNAMELEN];
	char szRemotePort[PORTNAMELEN], szLocalPort[PORTNAMELEN];
	char szLocalAddress[ADDRESSLEN], szRemoteAddress[ADDRESSLEN];
 
	nRetCode = LoadAPI(); 
	if (nRetCode == FALSE)
	{
		printf("Loadlibrary error!\n");
		return 0;
	}
	if( WSAStartup(MAKEWORD(1, 1), &WSAData ))
	{
		printf("WSAStartup error!\n");
		return 0;
	}
	nRetCode = pAllocateAndGetTcpExTableFromStack(&TCPExTable, TRUE, GetProcessHeap(), 2, 2);
	if( nRetCode ) 
	{
		printf("AllocateAndGetTcpExTableFromStack Error!\n");
		return 0;
	}
	nRetCode = pAllocateAndGetUdpExTableFromStack(&UDPExTable, TRUE, GetProcessHeap(), 2, 2 );
	if( nRetCode ) 
	{
		printf("AllocateAndGetUdpExTableFromStack Error!.\n");
		return -1;
	}
	 // Get TCP List
	printf("%-6s%-22s%-22s%-11s%s\n", "Proto", "Local Address","Foreign Address", "State","Process");
	for( i = 0; i < TCPExTable->dwNumEntries; i++ ) 
	{
		sprintf( szLocalAddress, "%s:%s", 
				GetIp(TCPExTable->table[i].dwLocalAddr, szLocalName),
				GetPort(TCPExTable->table[i].dwLocalPort, szLocalPort)
				);
		sprintf( szRemoteAddress, "%s:%s", 
				GetIp(TCPExTable->table[i].dwRemoteAddr, szRemoteName),
				GetPort(TCPExTable->table[i].dwRemotePort, szRemotePort)
				);

		printf("%-6s%-22s%-22s%-11s%s:%d\n", "TCP", 
				szLocalAddress, szRemoteAddress,
				TcpState[TCPExTable->table[i].dwState],
				GetProcessNameFromPID(TCPExTable->table[i].dwProcessId),
				TCPExTable->table[i].dwProcessId
			);
	}
	// Get UDP List
	for( i = 0; i < UDPExTable->dwNumEntries; i++ ) 
	{
	sprintf( szLocalAddress, "%s:%s", 
		GetIp(UDPExTable->table[i].dwLocalAddr, szLocalName),
		GetPort(UDPExTable->table[i].dwLocalPort, szLocalPort)
		);
	sprintf( szRemoteAddress, "%s", "*:*");
	printf("%-6s%-22s%-33s%s:%d\n", "UDP", 
		szLocalAddress, szRemoteAddress,
		GetProcessNameFromPID(TCPExTable->table[i].dwProcessId),
		TCPExTable->table[i].dwProcessId
		);
	}
	WSACleanup();
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?