[Решено]Получение ip

Модератор: Модераторы разделов

Аватара пользователя
Lostboy
Сообщения: 33
ОС: openSUSE/Mandriva

[Решено]Получение ip

Сообщение Lostboy »

Доброго времени суток!
Необходимо чтобы при запуске программы, в каком-нибудь статическом поле отображался ip адрес машины.
Пробовал использовать gethostname, а потом gethostbyname - в результате почему то выходило только 127.0.0.1, а мне необходимый мне айпи выглядит вот так: 192.168.78.134
Также пробовал getsockname, но его я могу использовать только в одном месте, при создании сервера, который прослушивает канал, а это происходит при запуске программы, но такой вариант выдавал мне 0.0.0.0
Какие есть варианты?
Спасибо сказали:
Аватара пользователя
кодировщик
Сообщения: 974
Статус: зарёган в пятницу 13
ОС: Linux

Re: [Решено]Получение ip

Сообщение кодировщик »

Код бы свой показыл полностью?! Тогда вот что первое в голову пришло

Код: Выделить всё

#include <libnet.h>
int main() {

        libnet_t *l;
        char errbuf[LIBNET_ERRBUF_SIZE];
        u_int32_t ip_addr;

        l = libnet_init(LIBNET_RAW4, NULL, errbuf);
        if ( l == NULL ) {
                fprintf(stderr, "libnet_init() failed: %s\n", errbuf);
                exit(EXIT_FAILURE);
        }

        ip_addr = libnet_get_ipaddr4(l);
        if ( ip_addr != -1 )
        printf("IP address: %s\n", libnet_addr2name4(ip_addr, LIBNET_DONT_RESOLVE));
        else
        fprintf(stderr, "Couldn't get own IP address: %s\n", libnet_geterror(l));
        libnet_destroy(l);
        return 0;
}
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: [Решено]Получение ip

Сообщение KiWi »

Немного гугла и, о ужас!
Мы знаем функцию, которая возвращает все сетевые соединения!
getifaddrs
Спасибо сказали:
Аватара пользователя
Lostboy
Сообщения: 33
ОС: openSUSE/Mandriva

Re: [Решено]Получение ip

Сообщение Lostboy »

Спасибо за функцию getifaddrs, тяжело ее найти если не знаешь в принципе о ней ничего:( А обычный поиск по этому вопросу выдавал только решения с gethostbyname и getsockname.
Может кому-то понадобится код: (получаем список всех айпи, и выбираем из них только те которые относятся к семейству AF_INET и те у которых интерфейсное имя не равно "lo" т.е. избавляемся от 127.0.0.1)

Код: Выделить всё

     struct ifaddrs *ifap, *ifap_tmp;
     getifaddrs(&ifap);
     for(ifap_tmp = ifap; ifap_tmp->ifa_next != NULL; ifap_tmp = ifap_tmp->ifa_next)
     {
        if(ifap_tmp->ifa_addr->sa_family != AF_INET) continue;
    if (!strcmp(ifap_tmp->ifa_name, "lo")) continue;
    printf("\nName= %s\n", ifap_tmp->ifa_name);
    char* my_ip_address = inet_ntoa(((struct sockaddr_in*)(ifap_tmp->ifa_addr))->sin_addr);
    printf("Address= %s\n", my_ip_address);
     }
     freeifaddrs(ifap);
Спасибо сказали: