Поделиться через


Управление IP-адресами с помощью GetIpAddrTable

Функция getIpAddrTableзаполняет указатель на структуру MIB_IPADDRTABLE с информацией о текущих IP-адресах, связанных с системой.

Чтобы использовать GetIpAddrTable

  1. Объявите указатель на объект MIB_IPADDRTABLE с именем pIPAddrTable, а объект DWORD , называемый dwSize. Эти переменные передаются в качестве параметров функции GetIpAddrTable. Кроме того, создайте переменную DWORD с именем dwRetVal (используется для проверки ошибок).

    MIB_IPADDRTABLE  *pIPAddrTable;
    DWORD            dwSize = 0;
    DWORD            dwRetVal;
    
    
  2. Выделите память для структуры.

    Заметка

    Размер dwSize недостаточен, чтобы хранить информацию. См. следующий шаг.

     

    pIPAddrTable = (MIB_IPADDRTABLE*) malloc( sizeof(MIB_IPADDRTABLE) );
    
    
  3. Сделайте первоначальный вызов GetIpAddrTable, чтобы определить необходимый размер переменной dwSize.

    Заметка

    Этот вызов функции предполагается, что завершится с ошибкой, и используется для обеспечения того, чтобы переменная dwSize указывала размер, достаточный для хранения всех сведений, возвращаемых указателю pIPAddrTable. Это общая модель программирования для структур данных и функций этого типа.

     

    if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
        free( pIPAddrTable );
        pIPAddrTable = (MIB_IPADDRTABLE *) malloc ( dwSize );
    }
    
    
  4. Выполните второй вызов GetIpAddrTable с проверкой общих ошибок и верните его значение в переменную dwRetVal типа DWORD (для более детальной проверки ошибок).

    if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) != NO_ERROR ) { 
        printf("GetIpAddrTable call failed with %d\n", dwRetVal);
    }
    
    
  5. Если вызов выполнен успешно, получите доступ к данным из структуры данных pIPAddrTable.

    printf("IP Address:         %ld\n", pIPAddrTable->table[0].dwAddr);
    printf("IP Mask:            %ld\n", pIPAddrTable->table[0].dwMask);
    printf("IF Index:           %ld\n", pIPAddrTable->table[0].dwIndex);
    printf("Broadcast Addr:     %ld\n", pIPAddrTable->table[0].dwBCastAddr);
    printf("Re-assembly size:   %ld\n", pIPAddrTable->table[0].dwReasmSize);
    
    
  6. Освобождает любую память, выделенную для структуры pIPAddrTable.

    if (pIPAddrTable)
            free(pIPAddrTable);
    
    

Заметка

Объекты DWORDdwAddr и dwMask возвращаются в виде числовых значений в порядке байтов хоста, а не в порядке байтов сети. Эти значения не являются IP-адресами в точечном формате.

 

Следующий шаг: управление арендой DHCP с помощью IpReleaseAddress и IpRenewAddress

Предыдущий шаг: управление интерфейсами с помощью GetInterfaceInfo