Разбор буфера с помощью 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);
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.5 из 5
Похожие ответы