Using GetExtendedTcpTable function to Get Active TCP endpoints List

The GetExtendedTcpTable function retrieves a table that contains a list of TCP endpoints available to the application.

C# Signature:

[DllImport("iphlpapi.dll", SetLastError=true)]
static extern uint GetExtendedTcpTable(IntPtr pTcpTable, ref int dwOutBufLen, bool sort, int ipVersion, TCP_TABLE_CLASS tblClass,int reserved);

  [StructLayout(LayoutKind.Sequential)]
    
public struct MIB_TCPROW_OWNER_PID
    {
        
public TcpState state;
        
public uint localAddr;
        
public byte localPort1;
        
public byte localPort2;
        
public byte localPort3;
        
public byte localPort4;
        
public uint remoteAddr;
        
public byte remotePort1;
        
public byte remotePort2;
        
public byte remotePort3;
        
public byte remotePort4;
        
public int owningPid;
    }
    [StructLayout(LayoutKind.Sequential)]
    
public struct MIB_TCPTABLE_OWNER_PID
    {
        
public uint dwNumEntries;
        MIB_TCPROW_OWNER_PID table;
    }

    
//public TcpRow[] GetAllTcpConnections()
    public MIB_TCPROW_OWNER_PID[] GetAllTcpConnections()
    {
    
//  TcpRow is my own class to display returned rows in a nice manner.
    
//    TcpRow[] tTable;
        MIB_TCPROW_OWNER_PID[] tTable;
        
int AF_INET = 2;    // IP_v4
        int buffSize = 0;

        
// how much memory do we need?
        uint ret = GetExtendedTcpTable(IntPtr.Zero, ref buffSize, true, AF_INET, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL,0);        
        IntPtr buffTable 
= Marshal.AllocHGlobal(buffSize);

        
try
        {
        ret 
= GetExtendedTcpTable(buffTable, ref buffSize, true, AF_INET, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL, 0);
        
if (ret != 0)
        {
            
return null;
        }

        
// get the number of entries in the table
        
//MibTcpTable tab = (MibTcpTable)Marshal.PtrToStructure(buffTable, typeof(MibTcpTable));
        MIB_TCPTABLE_OWNER_PID tab = (MIB_TCPTABLE_OWNER_PID)Marshal.PtrToStructure(buffTable, typeof(MIB_TCPTABLE_OWNER_PID));
        
//IntPtr rowPtr = (IntPtr)((long)buffTable + Marshal.SizeOf(tab.numberOfEntries) );
        IntPtr rowPtr = (IntPtr)((long)buffTable + Marshal.SizeOf(tab.dwNumEntries));
        
// buffer we will be returning
        
//tTable = new TcpRow[tab.numberOfEntries];
        tTable = new MIB_TCPROW_OWNER_PID[tab.dwNumEntries];

        
//for (int i = 0; i < tab.numberOfEntries; i++)        
        for (int i = 0; i < tab.dwNumEntries; i++)
        {
            
//MibTcpRow_Owner_Pid tcpRow = (MibTcpRow_Owner_Pid)Marshal.PtrToStructure(rowPtr, typeof(MibTcpRow_Owner_Pid));
            MIB_TCPROW_OWNER_PID tcpRow = (MIB_TCPROW_OWNER_PID)Marshal.PtrToStructure(rowPtr, typeof(MIB_TCPROW_OWNER_PID));
            
//tTable[i] = new TcpRow(tcpRow);
            tTable[i] = tcpRow;
            rowPtr 
= (IntPtr)((long)rowPtr + Marshal.SizeOf(tcpRow));   // next entry
        }

        }
        
finally
        {
        
// Free the Memory
        Marshal.FreeHGlobal(buffTable);
        }



        
return tTable;
    }


posted on 2007-09-11 16:30  lbq1221119  阅读(1535)  评论(0)    收藏  举报

导航