关于IPhelp库GetExtendedTcpTable函数的使用

由于最近要做的一个项目需要得到本机的网络进程,所以查了点资料用到了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的类似,希望对大家有用

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、付费专栏及课程。

余额充值