Список локальных IP-адресов

374
20 апреля 2017, 17:50

Можно ли получить все доступные IP-адреса хоста, не используя для этого его имя? Гугление привело к мысли, что под ОС Windows это придется делать с помощью функций GetAdaptersInfo\GetAdaptersAddresses, а под никсами - getifaddrs(), которую, в свою очередь, нельзя считать портабельной. Не существует какого-то более хитрого способа узнать поддерживается ли стеком TCP/IP хоста протокол IPv4 и IPv6 (да, изначально я хотел получить эти адреса для того, чтобы определить поддержку вышеуказанных протоколов)?

UPD0: Для ОС Windows (вдруг кому-то пригодится):

#define WORKING_BUFFER_SIZE 15000
#define MAX_TRIES 3
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define   FREE(x) HeapFree(GetProcessHeap(), 0, (x))
bool existLocalInterfaceSupportedSelectedNetFamily(int netFamily)
{
    bool bLookupResult = false;
    PIP_ADAPTER_ADDRESSES pAdapterAddrs = NULL;
    DWORD dwIterationResult = 0x00;
    ULONG ulIterationsCnt = 0x00;
    ULONG ulBufLength = WORKING_BUFFER_SIZE;
    do
    {
        pAdapterAddrs = (PIP_ADAPTER_ADDRESSES)MALLOC(WORKING_BUFFER_SIZE);
        dwIterationResult = GetAdaptersAddresses(netFamily
            , GAA_FLAG_INCLUDE_PREFIX
            , NULL
            , pAdapterAddrs
            , &ulBufLength);
        if (dwIterationResult == ERROR_BUFFER_OVERFLOW)
        {
            FREE(pAdapterAddrs);
            pAdapterAddrs = NULL;
        }
        else
            break;
        ++ulIterationsCnt;
    } 
    while (dwIterationResult == ERROR_BUFFER_OVERFLOW && ulIterationsCnt < MAX_TRIES);
    if (dwIterationResult == NO_ERROR)
    {
        PIP_ADAPTER_ADDRESSES pCurAdapterAddrs = NULL;
        for (pCurAdapterAddrs = pAdapterAddrs; pCurAdapterAddrs; pCurAdapterAddrs = pCurAdapterAddrs->Next)
            if ( pCurAdapterAddrs->IfType != IF_TYPE_SOFTWARE_LOOPBACK )
                bLookupResult |= (pCurAdapterAddrs->Flags
                    & ((netFamily == AF_INET) ? IP_ADAPTER_IPV4_ENABLED : IP_ADAPTER_IPV6_ENABLED) != 0x00);
    }
    if (pAdapterAddrs)
        FREE(pAdapterAddrs);
    return bLookupResult;
}
READ ALSO
Как работать с файлом занятым другим процессом? С++

Как работать с файлом занятым другим процессом? С++

Например я пытаюсь открыть файл и записать в него строку следующим образом

357
C++/QT и BASS.h

C++/QT и BASS.h

Возможно ли с помощью BASSh перехватывать все звуки, поступающие на саму звуковую карту или на микшер винды? Пока что документация BASSa не дала...

333
Проблема с получением списка файлов С++

Проблема с получением списка файлов С++

Имеется проблема с получением списка файловФункция выполняется

233
xCode no matching function for call to

xCode no matching function for call to

Есть массив объектов в формате jsonЧто то не могу запустить функцию удаления дубликатов объектов

372