Как программно получить IP-адрес в системе на основе Debian? - PullRequest
3 голосов
/ 31 марта 2009

Я пытаюсь получить 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 моя машина

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

Ответы [ 6 ]

5 голосов
/ 31 марта 2009

Вот небольшой и грязный код, который демонстрирует SIOCGIFCONF:

#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>

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
3 голосов
/ 24 апреля 2011

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

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

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

2 голосов
/ 31 марта 2009

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

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

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

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

1 голос
/ 23 апреля 2011

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

ip addr и разбор оттуда.

1 голос
/ 28 октября 2010

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

Для решения bash вот что я закончил:

#!/bin/bash

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

Заголовок обеспечивает возврат основного ip, так как мультидомные и / или логические интерфейсы также будут возвращаться без заголовка.

Так что, если скрипт находится в / sbin / get_primary_ip, вы можете сделать что-то вроде:

foo=$(get_primary_ip)
1 голос
/ 31 марта 2009

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

...