Нахождение IP-адреса по имени интерфейса - PullRequest
4 голосов
/ 03 ноября 2008

В системе Linux общие имена интерфейсов выглядят как eth0, eth1 и т. Д. Я знаю, как найти хотя бы один IP-адрес, используя gethostbyname или аналогичные функции, но я не знаю, как указать, какое имя интерфейс я хочу IP-адрес. Я мог бы использовать ifconfig и разобрать вывод, но выкладывание для этой информации кажется ... не элегантным.

Есть ли способ, скажем, перечислить все интерфейсы и их IP-адреса (и, возможно, MAC-адреса) в коллекцию? Или, по крайней мере, что-то вроде gethostbyinterface("eth0")?

Ответы [ 2 ]

9 голосов
/ 03 ноября 2008
// Originally from http://www.tlug.org.za/wiki/index.php/Obtaining_your_own_IP_address

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

/**
 * getIPv4()
 *
 * This function takes a network identifier such as "eth0" or "eth0:0" and
 * a pointer to a buffer of at least 16 bytes and then stores the IP of that
 * device gets stored in that buffer.
 *
 * it return 0 on success or -1 on failure.
 *
 * Author:  Jaco Kroon <jaco@kroon.co.za>
 */
int getIPv4(const char * dev, char * ipv4) {
    struct ifreq ifc;
    int res;
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    if(sockfd < 0)
        return -1;
    strcpy(ifc.ifr_name, dev);
    res = ioctl(sockfd, SIOCGIFADDR, &ifc);
    close(sockfd);
    if(res < 0)
        return -1;     
    strcpy(ipv4, inet_ntoa(((struct sockaddr_in*)&ifc.ifr_addr)->sin_addr));
    return 0;
}


int main() {
    char ip[16];
    if(getIPv4("eth0", ip) == 0)
        printf("IPv4: %s\n", ip);
    else
        printf("No IP\n");
    return 0;
 }

Обновление : перемещена мертвая ссылка на комментарий (для потомков) (спасибо @obayhan) и добавлена ​​подсветка синтаксиса.

3 голосов
/ 03 ноября 2008

edit: Я видел, что вы не любите обстреливать. Затем вы можете посмотреть, как ifconfig выполняет свою работу (он извлекает хотя бы некоторую информацию из /proc).

Если у вас есть имя интерфейса, вы можете сделать это (в вашей оболочке):

ifconfig eth0 | grep 'inet addr' | sed -e 's/:/ /' | awk '{print $3}'

Для перечисления интерфейсов вы можете использовать это:

ifconfig | egrep '^[^ ]' | awk '{print $1}'

Комбинированный:

for x in `ifconfig | egrep '^[^ ]' | awk '{print $1}'`; do
  echo -n "${x}"
  echo -n "    "
  ifconfig "${x}" | grep 'inet addr' | sed -e 's/:/ /' | awk '{print $3}'
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...