进程与网络(TCP) GetExtendedTcpTable

本文展示了如何使用Windows API函数GetExtendedTcpTable获取TCP连接信息,包括本地和远程地址、状态以及关联的进程ID。代码示例中包含了处理缓冲区大小不足和无效参数的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// TcpPid.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <iostream>
#include <iomanip>
using namespace std;

#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))

int _tmain(int argc, _TCHAR* argv[])
{
	PMIB_TCPTABLE_OWNER_PID ptTable;
	DWORD dwSize = { 0 };
	DWORD dwRetValue = { 0 };
	struct in_addr inAddr;

	static char TcpState[][32] = 
	{
		"???",
		"CLOSED",
		"LISTENING",
		"SYN_SENT",
		"SEN_RECEIVED",
		"ESTABLISHED",
		"FIN_WAIT",
		"FIN_WAIT2",
		"CLOSE_WAIT",
		"CLOSING",
		"LAST_ACK",
		"TIME_WAIT"
	};

	ptTable= (MIB_TCPTABLE_OWNER_PID*)MALLOC(sizeof(MIB_TCPTABLE_OWNER_PID));
	dwSize = sizeof(MIB_TCPTABLE);

	if ((dwRetValue = GetExtendedTcpTable(ptTable, &dwSize, TRUE, AF_INE
TCP,UDP服务端口,HMODULE hIpDLL = LoadLibrary( "iphlpapi.dll"); if ( !hIpDLL) return; PMIB_TCPTABLE_OWNER_PID pTcpTable(NULL); DWORD dwSize(0); PGet_Extended_TcpTable pGetExtendedTcpTable = NULL; pGetExtendedTcpTable = (PGet_Extended_TcpTable) GetProcAddress(hIpDLL, "GetExtendedTcpTable"); if(pGetExtendedTcpTable==NULL) { FreeLibrary(hIpDLL); return; } if(pGetExtendedTcpTable(pTcpTable, &dwSize, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0) == ERROR_INSUFFICIENT_BUFFER) pTcpTable = (MIB_TCPTABLE_OWNER_PID *)new char[dwSize];//重新分配缓冲区 if (pGetExtendedTcpTable(pTcpTable, &dwSize, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0) != NO_ERROR) { delete pTcpTable; return; } CString sTemp; m_PortList.DeleteAllItems(); int nNum = (int)pTcpTable->dwNumEntries; //TCP连接的数目 // nNum = 0; for (int i = 0; itable[i].dwLocalAddr))); sTemp.Format("%u",htons((WORD)pTcpTable->table[i].dwLocalPort)); m_PortList.SetItemText(i,4,sTemp); m_PortList.SetItemBgColor(i,4,RGB(210,0,0)); m_PortList.SetItemText(i,5,FormatNumToIpv4(htonl(pTcpTable->table[i].dwRemoteAddr))); sTemp.Format("%u",htons((WORD) pTcpTable->table[i].dwRemotePort)); m_PortList.SetItemText(i,6,sTemp); sTemp.Format("%u",pTcpTable->table[i].dwOwningPid); m_PortList.SetItemText(i,8,sTemp); //ProcessPidToName(pTcpTable->table[i].dwOwningPid,i); ProcessPidToNameX(pTcpTable->table[i].dwOwningPid,i); switch (pTcpTable->table[i].dwState) { case MIB_TCP_STATE_CLOSED: m_PortList.SetItemText(i,2,"CLOSED"); break; case MIB_TCP_STATE_LISTEN: m_PortList.SetItemText(i,2,"LISTEN"); break; case MIB_TCP_STATE_SYN_SENT: m_PortList.SetItemText(i,2,"SYN
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值