由于最近要做的一个项目需要得到本机的网络进程,所以查了点资料用到了IPhelp这个库。说来也是各种纠结。首先这个库的头文件和lib文件我的机器上竟然都没有,还要在网上找,其次就是当我用到AllocateAndGetTcpExTableFromStack这个函数来获取扩展的TCP链接表时这个函数竟然vista以后不支持了。于是上网查了GetExtendedTcpTable这个函数可以代替他的功能,但是关于这个函数的用法网上的却很少,经过一下午的努力终于成功了,下面我贴出我的代码供大家学习,关键的部分我会附上注释。
首先是我用到的两个结构可以在MSDN上查到
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;
typedef struct {
DWORD dwNumEntries;
MIB_TCPROW_OWNER_PID table[ANY_SIZE];
}MIB_TCPTABLE_OWNER_PID,*PMIB_TCPTABLE_OWNER_PID;
其次是GetExtendedTcpTable的使用由于这个函数在Iphlpapi.h头文件中并没有给出所以必须动态调用了
定义函数指针
ypedef DWORD (WINAPI *PGetExtendedTcpTable)(
PVOID pTcpTable,
PDWORD pdwSize,
BOOL bOrder,
ULONG ulAf,
TCP_TABLE_CLASS TableClass,
ULONG Reserved
);
代码:
PMIB_TCPTABLE_OWNER_PID pTcpExTable;
HINSTANCE hLibrary = LoadLibrary( "Iphlpapi.dll "); //载入库
PGetExtendedTcpTable pFuncGetTCPTable;
pFuncGetTCPTable = (PGetExtendedTcpTable)::GetProcAddress(hLibrary,"GetExtendedTcpTable");
//获得GetExtendedTcpTable函数
int code = pFuncGetTCPTable(NULL,&dwSize, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL,0);
//第一次调用前两个参数为NULL,dwsize(值 为0),原因是第二个参数是一个in out 参数 第一次调用的目的是为了返回dwsize后的值
pTcpExTable = new MIB_TCPTABLE_OWNER_PID[dwSize];//然后动态分配空间
pFuncGetTCPTable(pTcpExTable,&dwSize, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL,0);
//二次调用函数调用得到列表 这里要注意的是TCP_TABLE_OWNER_PID_ALL对应MIB_TCPTABLE_OWNER_PID这个格式的pTcpExTable还有别的格式需要在可以查MSDN GetExtendedTcpTable函数的文档。
就这么多了,UDP的类似,希望对大家有用