LINUX.ORG.RU

#include <stdio.h>
#include <net/if.h>

int
main()
{
        struct if_nameindex *ni;
        int i;
        ni = if_nameindex();

        if (ni == NULL) {
                perror("if_nameindex()");
                exit(1);
        }

        for (i = 0; ni[i].if_index != 0 && ni[i].if_name != NULL; i++)
                printf("%d: %s\n", ni[i].if_index, ni[i].if_name);
        return 0;
}
kemm
()
Ответ на: комментарий от Artem-Dnepr

IP адрес можно получить примерно так (кусок из моего кода, лишнее выкинуть):


    struct in_addr     m_ip;
    struct in_addr     m_broadcast;
    struct in_addr     m_netmask;



/**
* @brief   Get IP addresses for our interface. Together with our IP will be
*          requested broadcast and netmask
* @param   Name of interface for request
*/
void CIpHandler::refreshIpAdresses( string interface )
{
 struct ifreq ifr;
 int fd;

    IPH_DEBUG( DEVELOP_INFO( "Check if IP resolved for %s", interface.c_str() ));

    fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
    if( fd < 0 )
    {
       DEVELOP_WARN( "socket() problem" );
       return;
    }
    ifr.ifr_addr.sa_family = AF_INET;
    strncpy( ifr.ifr_name, interface.c_str(), IFNAMSIZ-1 );

    /* Get all necessary addresses */
    if( ioctl(fd, SIOCGIFADDR, &ifr) < 0 )
    {
        DEVELOP_WARN( "ioctl() returns error");
        close( fd );
        return;
    }
    memcpy( &m_ip, &((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr, sizeof(m_ip) );
    IPH_DEBUG( DEVELOP_INFO( "Our IP=%s", inet_ntoa( m_ip ) ));

    if( ioctl(fd, SIOCGIFBRDADDR, &ifr) < 0 )
    {
        DEVELOP_WARN( "ioctl() returns error");
        close( fd );
        return;
    }
    memcpy( &m_broadcast, &((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr, sizeof(m_ip) );
    IPH_DEBUG( DEBUG_LOCAL( Log::INFO, "Broad IP=%s", inet_ntoa( m_broadcast ) ));

    if( ioctl(fd, SIOCGIFNETMASK, &ifr) < 0 )
    {
        DEVELOP_WARN( "ioctl() returns error");
        close( fd );
        return;
    }
    memcpy( &m_netmask, &((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr, sizeof(m_ip) );
    IPH_DEBUG( DEVELOP_INFO( "Netmask IP=%s", inet_ntoa( m_netmask ) ));

    close( fd );
}

velikS
()
Ответ на: комментарий от velikS

>* @brief Get IP addresses for our interface. Together with our IP will be

* requested broadcast and netmask

* @param Name of interface for request



Ты бы лучше на русском языке комментарии писал. Выпендриваться на иностранных буквах у тебя не получается.

anonymous
()
Ответ на: комментарий от anonymous

ты троллирушь, чтоле? Там если к чему придираться, то толко к string.

anonymous
()
Ответ на: комментарий от Raving_Zealot

> Там если к чему придираться, то толко к string.

Ну это - не Цэсшый код, из-за другого куска кода мне удобнее имя интерфейса держать в string. Ну а передача ссылки, тут - да, ссылку передавать эффективней, но, учитывая, что метод вызывается только однажды (когда присоединяется USB-LAN адаптер) потеря производительности тут никого особо не волнует. просмотрел этот и еще другие методы этого класса - помарок предостаточно. Надо будет в понедельник CodeReview этого класса сделать.

velikS
()
Ответ на: комментарий от DELIRIUM

Дык есть же библиотеки, которые и парсят /proc. Необходимо лишь вызвать нужную функцию.

Eddy_Em ☆☆☆☆☆
()

Да, через Ioctl можно, но это уже сильно устаревший метод. Надо через netlink socket. Посмотри биндинги к питону для твоей задачи (их несколько разны, делают одно и то же) - они вполне понятные и написаны на Си.

mmarkk
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.