关于如何捕获连接本机的远程IP地址:
我本机上有SOCKET编写服务端,远程连接上的客户端.(因为原软件的代码已经不在,无法进行改动.)
现我想另外在写个程序,捕获连接本服务端的IP地址,如何实现?

解决方案 »

  1.   

    // 最好的方法, 调用 GetExtendedTcpTable()const // const for GetExtendedTcpTable
      MIB_TCP_STATE_CLOSED = 1;
      MIB_TCP_STATE_LISTEN = 2;
      MIB_TCP_STATE_SYN_SENT = 3;
      MIB_TCP_STATE_SYN_RCVD = 4;
      MIB_TCP_STATE_ESTAB = 5;
      MIB_TCP_STATE_FIN_WAIT1 = 6;
      MIB_TCP_STATE_FIN_WAIT2 = 7;
      MIB_TCP_STATE_CLOSE_WAIT = 8;
      MIB_TCP_STATE_CLOSING = 9;
      MIB_TCP_STATE_LAST_ACK = 10;
      MIB_TCP_STATE_TIME_WAIT = 11;
      MIB_TCP_STATE_DELETE_TCB = 12;
      TCP_TABLE_BASIC_LISTENER = 0;
      TCP_TABLE_BASIC_CONNECTIONS = 1;
      TCP_TABLE_BASIC_ALL = 2;
      TCP_TABLE_OWNER_PID_LISTENER = 3;
      TCP_TABLE_OWNER_PID_CONNECTIONS = 4;
      TCP_TABLE_OWNER_PID_ALL = 5;
      TCP_TABLE_OWNER_MODULE_LISTENER = 6;
      TCP_TABLE_OWNER_MODULE_CONNECTIONS = 7;
      TCP_TABLE_OWNER_MODULE_ALL = 8;
      UDP_TABLE_BASIC =0;
      UDP_TABLE_OWNER_PID = 1;
      UDP_TABLE_OWNER_MODULE = 2;
      ERROR_INSUFFICIENT_BUFFER = 122;  MIB_IF_OPER_STATUS_CONNECTING = 3;
      MIB_IF_OPER_STATUS_CONNECTED = 4;
      MIB_IF_OPER_STATUS_OPERATIONAL = 5;  MIB_IF_ADMIN_STATUS_UP = 1;
      MIB_IF_ADMIN_STATUS_DOWN = 2;
      MIB_IF_ADMIN_STATUS_TESTING = 3;type // type for GetExtendedTcpTable
      TMIB_TCPROW_OWNER_PID = Record
        dwState: DWORD;
        dwLocalAddr: DWORD;
        dwLocalPort: DWORD;
        dwRemoteAddr: DWORD;
        dwRemotePort: DWORD;
        dwOwningPid: DWORD;
      end;
      PMIB_TCPROW_OWNER_PID = ^TMIB_TCPROW_OWNER_PID;  TMIB_TCPTABLE_OWNER_PID = Record
        dwNumEntries: DWORD;
        table: array [0..999] of TMIB_TCPROW_OWNER_PID;
      end;
      PMIB_TCPTABLE_OWNER_PID = ^TMIB_TCPTABLE_OWNER_PID;
    var
      ptcp: PMIB_TCPTABLE_OWNER_PID;
      dwsize: DWORD;
      i: integer;
    begin
        dwsize := 0;
        if GetExtendedTcpTable(ptcp, @dwsize, True, AF_INET,
              TCP_TABLE_OWNER_PID_CONNECTIONS, 0) = ERROR_INSUFFICIENT_BUFFER then
          ptcp := AllocMem(dwsize)
        else
          exit;
        PIDList.Clear();
        CntList.Clear();
        if GetExtendedTcpTable(ptcp, @dwsize, True, AF_INET,
              TCP_TABLE_OWNER_PID_CONNECTIONS, 0) = 0 then
        begin
          for i := 0 to ptcp.dwNumEntries-1 do
            with ptcp.table[i] do // table[i]对应一个连接
              // 此处对连接的属性进行判断
    ......
      

  2.   

    不好意思, 上面有两条语句你要删除
    PIDList.Clear();
    CntList.Clear();