获取进程网络连接状态

来源:互联网 发布:微信成绩查询系统源码 编辑:程序博客网 时间:2024/06/05 02:40

只实现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 argsusedtypedef 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;}//---------------------------------------------------------------------------


原创粉丝点击