获取进程网络连接状态

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


要通过进程获取进程的网络使用情况,你可以使用 `psutil` 模块来实现。`psutil` 提供了一个 `Process` 类,可以用于获取进程的各种信息,包括网络信息。 以下是一个示例代码,演示如何通过进程获取进程的网络使用情况: ```python import psutil def get_process_network_usage(pid): process = psutil.Process(pid) connections = process.connections() network_usage = [] for conn in connections: if conn.status == 'ESTABLISHED': network_usage.append({ 'local_address': conn.laddr.ip, 'local_port': conn.laddr.port, 'remote_address': conn.raddr.ip, 'remote_port': conn.raddr.port }) return network_usage if __name__ == '__main__': pid = 1234 # 替换为你要获取信息的进程号 network_usage = get_process_network_usage(pid) for usage in network_usage: print(f"Local: {usage['local_address']}:{usage['local_port']} - " f"Remote: {usage['remote_address']}:{usage['remote_port']}") ``` 在上述代码中,我们定义了一个函数 `get_process_network_usage` 来获取给定进程号的进程的网络使用情况。我们使用 `psutil.Process` 类来创建一个 `Process` 对象,并使用 `connections` 方法来获取进程网络连接信息。然后,我们筛选出状态为 'ESTABLISHED' 的连接,并将其本地地址、本地端口、远程地址和远程端口存储在 `network_usage` 列表中。 请确保将 `pid` 替换为你要获取信息的实际进程号。最后,我们打印出每个连接的本地地址、本地端口、远程地址和远程端口信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值