任务: 列举本机所有网络活动的进程信息,包括协议类型、进程ID及其名称、本地地址及对应端口、远程地址及对应端口、当前连接状态信息。
环境: Win7 + VC++2010
注:(1)本例程适用于Windows Vista / 7, VS2010以上版本(VS2008未测试),不适用于VS2005以下版本。
(2)VS2005中没有TCP_TABLE_CLASS 的定义
(3)在windows vista以及更高版本,AllocateAndGetTcpExTableFromStack函数已经被废弃,由GetTcpTable和GetUdpTable替代,Udp相关函数类似.
步骤:
1. 创建MFC单文档程序,并在向导中选中Win socket ,视图基类选为CListView;
2. 在View类的头文件中添加包含文件和库:
#include <WinSock2.h>
#include <IPHlpApi.h>
#include <TlHelp32.h>
#pragma comment(lib, "WS2_32.lib")
#pragma comment(lib, "Iphlpapi.lib")
3. 在View类的PreCreateWindow函数中设置视图风格:
BOOL CNetProcessView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.style = (cs.style & (~LVS_TYPEMASK) | LVS_REPORT);
cs.style |= LVS_AUTOARRANGE;
return CListView::PreCreateWindow(cs);
}
4. 由于包含的头文件中没有GetExtendedTcpTable()函数的定义,因此需要自己定义导出函数原型,如下:
//定义函数指针,以便调用GetExtendedTcpTable()
typedef DWORD (WINAPI *PGetExtendedTcpTable)(
_Out_ PVOID pTcpTable,
_Inout_ PDWORD pdwSize,
_In_ BOOL bOrder,
_In_ ULONG ulAf,
_In_ TCP_TABLE_CLASS TableClass,
_In_ ULONG Reserved
);
// GetExtendedUdpTable()
typedef DWORD (W