Разбор буфера с помощью GetExtendedTcpTable() - C#
Формулировка задачи:
Здравствуйте!Из библиотеки IpHlpApi я использую функцию GetExtendedTcpTable и данные помещаю в byte[] buffer. Каким образом вытащить оттуда localIP, remoteIP и PID.Спасибо!
Решение задачи: «Разбор буфера с помощью GetExtendedTcpTable()»
textual
Листинг программы
enum TCP_TABLE_CLASS
{
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
}
private struct MIB_TCPROW_OWNER_PID
{
private uint dwState;
private uint dwLocalAddr;
private uint dwLocalPort;
private uint dwRemoteAddr;
private uint dwRemotePort;
private uint dwOwningPid;
};
const uint ERROR_INSUFFICIENT_BUFFER = 122;
const uint NO_ERROR = 0;
private const uint AF_INET = 2;
private const uint AF_INET6 = 23;
[DllImport( "Iphlpapi.dll", SetLastError = true, ExactSpelling = true )]
static extern uint GetExtendedTcpTable (
IntPtr pTcpTable,
ref int pdwSize,
[MarshalAs( UnmanagedType.Bool )] bool bOrder,
uint ulAf,
TCP_TABLE_CLASS TableClass,
uint Reserved
);
static void Main ( string[] args )
{
IntPtr ptr = IntPtr.Zero;
int buffSize = 0;
uint dwError;
dwError = GetExtendedTcpTable( ptr, ref buffSize, false, AF_INET, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL, 0 );
if ( dwError != ERROR_INSUFFICIENT_BUFFER )
return;
ptr = Marshal.AllocHGlobal( buffSize );
dwError = GetExtendedTcpTable( ptr, ref buffSize, false, AF_INET, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL, 0 );
if ( dwError != NO_ERROR )
{
Marshal.FreeHGlobal( ptr );
return;
}
int count = Marshal.ReadInt32( ptr );
IntPtr ptrRead = ptr + sizeof( int );
int sz = Marshal.SizeOf( typeof( MIB_TCPROW_OWNER_PID ) );
var arr = new MIB_TCPROW_OWNER_PID[count];
for ( int i = 0; i < count; i++ )
{
arr[i] = (MIB_TCPROW_OWNER_PID)Marshal.PtrToStructure( ptrRead, typeof( MIB_TCPROW_OWNER_PID ) );
ptrRead += sz;
}
Marshal.FreeHGlobal(ptr);
}