Форум программистов, компьютерный форум, киберфорум
С под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 20.10.2016
Сообщений: 75
1

Программа для нахождения IP-адреса

06.03.2017, 21:41. Просмотров 643. Ответов 4

Здравствуйте, есть программа, определяющая IPv4 и IPv6 адреса компьютера. Нужно немного переделать эту прогу так, чтобы она выдавала только один 'главный' IPv4.
Код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#define _GNU_SOURCE  /* To get defns of NI_MAXSERV and NI_MAXHOST */
#include <errno.h>
#include <error.h>
#include <ifaddrs.h>
#include <netdb.h>
#include <stdio.h>
#include <sys/types.h>
 
int main(int argc, char *argv[])
{
    struct ifaddrs *ifaces, *ifa;
 
    if (getifaddrs(&ifaces))
        error(1, errno, "getifaddrs() error");
 
        // перебираем все элементы
    for (ifa = ifaces; ifa != NULL; ifa = ifa->ifa_next) {
        char host[NI_MAXHOST];
        int family = ifa->ifa_addr->sa_family;
        int size = family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6);
 
                // если это не IPv4 и не IPv6, то пропускаем
        if (family != AF_INET && family != AF_INET6)
            continue;
 
        printf("Interface: %s\n", ifa->ifa_name);
                // получаем читабельный вид IP-адреса
        if (getnameinfo(ifa->ifa_addr, size, host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST))
            error(1, errno, "getnameinfo() error");
        
        printf("%s address: %s\n", (family == AF_INET) ? "IPv4" : "IPv6", host);
        printf("\n");
    }
    freeifaddrs(ifaces);  // не забываем освобождать память, которую заняли при вызове getifaddrs()
    
    return 0;
}
\\Для того, чтобы выводились одни только IPv4, нужно заменить строку:
C
1
if (family != AF_INET && family != AF_INET6)
на:
C
1
if (family != AF_INET)
\\, но это не то, что нужно, так как надо получить только один адрес.
Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.03.2017, 21:41
Ответы с готовыми решениями:

Программа для динамической смены IP адреса
Как написать программу смены . Я знаю как менять , мне нужен метод создания. Спасибо заранее!

Программа для обработки адреса электронной почты
Ребят,может быть у кого-то было подобное задание Разработать программу,которая позволяет ввести...

Программа для нахождения......
Нужна программа на языке Cи для нахождения наибольшего общего делителя для двух натуральных числел,...

Программа для нахождения суммы и произведения для наибольшего и наименьшего элемента матрицы
в заданной матрице (m x n) найти сумму и произведение наибольшего и наименьшего (по абсолютной...

4
48 / 46 / 18
Регистрация: 27.04.2016
Сообщений: 169
06.03.2017, 21:57 2
MalkovM, а что в вашем понимании главный IP-адрес?
0
0 / 0 / 0
Регистрация: 20.10.2016
Сообщений: 75
06.03.2017, 22:21  [ТС] 3
si1n3rd, внешний IPv4. Я так думаю...
0
Почетный модератор
11153 / 4111 / 408
Регистрация: 12.06.2008
Сообщений: 11,908
08.03.2017, 00:28 4
Можно отсечь loopback и выключенные интерфейсы. Например, в описании функции getifaddrs() сказано, что в структуре struct ifaddrs есть поле ifa_flags. Так же сказано, что список флагов приведён в описании netdevice. Например, можно сразу отсекать интерфейсы с флагом IFF_LOOPBACK (это будет интерфейс lo) и те интерфейсы, у которых нет флага IFF_UP.
0
0 / 0 / 0
Регистрация: 20.10.2016
Сообщений: 75
17.03.2017, 20:58  [ТС] 5
Humanoid, другими словами, нужно выполнять программу только для интерфейсов с флагом IFF_UP? А как это условие прописать?

Добавлено через 7 часов 7 минут
Humanoid, я нашел программу на С#, которая берёт строку с готовым IP-адресом с сайта icanhazip.com. Возможно ли сделать то же самое на си?
C#
1
2
3
4
5
6
static void Main(string[] args)
{
    string IP = new WebClient().DownloadString("http://icanhazip.com/");
    Console.WriteLine(IP);
    Console.ReadLine();
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.03.2017, 20:58

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Программа для нахождения суммы
Найти сумму \sum_{x=1}^{50}\frac{1}{x^^5}

Программа для нахождения числа
Дана последовательность целых чисел.Известно,что все числа в ней встречаются четное количество раз,...

Программа для нахождения 1 2 и 3 места
Условие : Дано : Відомості про результати проведення олімпіади з програмування (прізвище...

Программа для нахождения суммы
Здравствуйте! Всю ночь думаю, но никак не нашел решения. Надо написать программу, которая будет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.