获取进程网络连接状态

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值