只实现TCP连接状态查看
UDP类似请参考MSDN
GetExtendedTcpTable
GetExtendedUdpTable
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <iphlpapi.h>
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
//---------------------------------------------------------------------------
#pragma argsused
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;
typedef enum {
TCP_TABLE_BASIC_LISTENER,
TCP_TABLE_BASIC_CONNECTIONS,
TCP_TABLE_BASIC_ALL,
TCP_TABLE_OWNER_PID_LISTENER,
TCP_TABLE_OWNER_PID_CONNECTIONS,
TCP_TABLE_OWNER_PID_ALL,
TCP_TABLE_OWNER_MODULE_LISTENER,
TCP_TABLE_OWNER_MODULE_CONNECTIONS,
TCP_TABLE_OWNER_MODULE_ALL
} TCP_TABLE_CLASS, *PTCP_TABLE_CLASS;
String addr2string(ULONG addr)
{
in_addr in;
in.S_un.S_addr=addr;
return String(inet_ntoa(in));
}
String tcpstate2string(DWORD state)
{
String ret;
switch(state)
{
case MIB_TCP_STATE_CLOSED: //= 1,
{
ret="CLOSED";
}
break;
case MIB_TCP_STATE_LISTEN: //= 2,
{
ret="LISTEN";
}
break;
case MIB_TCP_STATE_SYN_SENT: //= 3,
{
ret="SYN_SENT";
}
break;
case MIB_TCP_STATE_SYN_RCVD: //= 4,
{
ret="SYN_RCVD";
}
break;
case MIB_TCP_STATE_ESTAB: //= 5,
{
ret="ESTAB";
}
break;
case MIB_TCP_STATE_FIN_WAIT1: //= 6,
{
ret="FIN_WAIT1";
}
break;
case MIB_TCP_STATE_FIN_WAIT2: //= 7,
{
ret="FIN_WAIT2";
}
break;
case MIB_TCP_STATE_CLOSE_WAIT: //= 8,
{
ret="CLOSE_WAIT";
}
break;
case MIB_TCP_STATE_CLOSING: //= 9,
{
ret="CLOSING";
}
break;
case MIB_TCP_STATE_LAST_ACK: //= 10,
{
ret="LAST_ACK";
}
break;
case MIB_TCP_STATE_TIME_WAIT: //= 11,
{
ret="TIME_WAIT";
}
break;
case MIB_TCP_STATE_DELETE_TCB: //= 12,
{
ret="DELETE_TCB";
}
break;
}
return ret;
}
int main(int argc, char* argv[])
{
WSAData wsaData;
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
return 1;
HMODULE hDll=LoadLibraryA("iphlpapi.dll");
if(hDll)
{
typedef DWORD (WINAPI *lpfnGetExtendedTcpTable)(
/*__out*/ PVOID pTcpTable,
/*__inout*/ PDWORD pdwSize,
/*__in*/ BOOL bOrder,
/*__in*/ ULONG ulAf,
/*__in*/ TCP_TABLE_CLASS TableClass,
/*__in*/ ULONG Reserved
);
lpfnGetExtendedTcpTable GetExtendedTcpTable=(lpfnGetExtendedTcpTable)GetProcAddress(hDll,"GetExtendedTcpTable");
LPVOID pBuf=NULL;
DWORD dwSize=0;
if(GetExtendedTcpTable(pBuf,&dwSize,TRUE,AF_INET,TCP_TABLE_OWNER_PID_ALL/*TCP_TABLE_OWNER_PID_CONNECTIONS*/,0)==ERROR_INSUFFICIENT_BUFFER)
{
do
{
pBuf=GlobalAlloc(GPTR,dwSize);
if(!pBuf)
break;
GetExtendedTcpTable(pBuf,&dwSize,TRUE,AF_INET,TCP_TABLE_OWNER_PID_ALL/*TCP_TABLE_OWNER_PID_CONNECTIONS*/,0);
PMIB_TCPTABLE_OWNER_PID tcpTable=(PMIB_TCPTABLE_OWNER_PID)(pBuf);
for(UINT i=0;i<tcpTable->dwNumEntries;++i)
{
String s;
if(tcpTable->table[i].dwState==MIB_TCP_STATE_LISTEN)
s=String().sprintf("PID:%.4d %s:%d State:%s",
tcpTable->table[i].dwOwningPid,
addr2string(tcpTable->table[i].dwLocalAddr).c_str(),
ntohs(tcpTable->table[i].dwLocalPort),
tcpstate2string(tcpTable->table[i].dwState).c_str());
else
s=String().sprintf("PID:%.4d %s:%d-%s:%d State:%s",
tcpTable->table[i].dwOwningPid,
addr2string(tcpTable->table[i].dwLocalAddr).c_str(),
ntohs(tcpTable->table[i].dwLocalPort),
addr2string(tcpTable->table[i].dwRemoteAddr),
ntohs(tcpTable->table[i].dwRemotePort),
tcpstate2string(tcpTable->table[i].dwState).c_str());
puts(s.c_str());
}
}while(0);
GlobalFree(pBuf);
}
FreeLibrary(hDll);
}
WSACleanup();
getchar();
return 0;
}
//---------------------------------------------------------------------------