Как получить IP-адрес программно в системе на базе Debian?

Я пытаюсь получить IP Address локального компьютера в моей программе. Операционная система – Ubuntu 8.10 . Я попытался использовать gethostname() и gethostbyname() для получения IP Address . Ответ, который я получил, – 127.0.1.1 . Я узнал, что это, похоже, вещь Debian . В этом документе объясняется идея.

Содержимое моего файла /etc/hosts :

127.0.0.1 localhost
127.0.1.1 mymachine

В этом случае есть ли другой способ программно (предпочтительнее C или C ++) получать IP-адрес без изменения системного файла на компьютере?

    См. «Netdevice», через man netdevice или в Интернете .
    Затем SIOCGIFCONF можно использовать для enums всех адресов транспортного уровня.

    Редактировать (по manpages): man – очень полезная команда для Linux (или других UNIX-подобных систем). В нем показано краткое описание большинства команд, функций библиотеки, программ и т. Д. Откройте приглашение оболочки и введите man ls или man netdevice , и вы увидите, что я имею в виду.

    Редактировать (при общем изъятии IP-адреса): Самый простой способ, если вы считаете, что C-путь слишком запутан, – это простой сценарий оболочки (как раз с моей головы):
    ifconfig|grep 'inet addr'|awk '{print $2}'|sed 's/addr://g'

    Изменить (в решении Brain): то, что он делает, использует функцию if_nameindex () для поиска всех имен сетевых устройств, а затем SIOCFIFCONF ioctl для каждого из этих имен для поиска своего IP-адреса. По его словам, он отображает только один IP-адрес на устройство.

    Вот какой быстрый и грязный код, демонстрирующий SIOCGIFCONF:

     #include  #include  #include  #include  #include  #include  int main() { int sock, i; struct ifreq ifreqs[20]; struct ifconf ic; ic.ifc_len = sizeof ifreqs; ic.ifc_req = ifreqs; sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { perror("socket"); exit(1); } if (ioctl(sock, SIOCGIFCONF, &ic) < 0) { perror("SIOCGIFCONF"); exit(1); } for (i = 0; i < ic.ifc_len/sizeof(struct ifreq); ++i) printf("%s: %s\n", ifreqs[i].ifr_name, inet_ntoa(((struct sockaddr_in*)&ifreqs[i].ifr_addr)->sin_addr)); return 0; } 

    Я получаю следующий вывод на моей машине Linux.

     lo: 127.0.0.1 br0: 192.168.0.42 dummy1: 10.0.0.2 

    Итак, по мнению Кена:

     ip addr show scope global | grep inet | cut -d' ' -f6 | cut -d/ -f1 

    Позор, когда боги Debian сделали команду «ip», они не думали добавлять простую команду, чтобы получить только IP-адрес.

    Взгляните на страницу руководства netdevice . Вызовите SIOCGIFCONF, чтобы получить список всех интерфейсов и их адресов.

    Спасибо всем за акции!

    Для решения bash это то, с чем я столкнулся:

     #!/bin/bash /sbin/ifconfig|fgrep 'inet addr:'|fgrep -v '127'|cut -d: -f2|awk '{print $1}'|head -n1 

    Головка обеспечивает возврат первичного ip, так как multi homed и / или логические интерфейсы также будут возвращены без головы.

    Поэтому, если скрипт находился в / sbin / get_primary_ip, вы могли бы делать такие вещи, как:

     foo=$(get_primary_ip) 

    ifconfig устарел и устарел. iproute2 – это новый стек, используйте команду ip:

    ip addr, и проанализируйте оттуда.