LINUX.ORG.RU

Узнать MAC-адрес по IP

 


0

1

Здравствуйте! Скажите пожалуйста, как можно узнать MAC-адрес устройства в локальной сети, зная его IP? Есть вот такой код, но при использовании этой функции получаю «ioctl: No such device», хотя устройство с этим адресом точно подключено.

void *GetMAC(char *IP) {
    int s;
    struct arpreq arpreq;
    struct sockaddr_in *sin;
    unsigned char *eap;

    memset(&arpreq, 0, sizeof(arpreq));

    sin = (struct sockaddr_in *) &arpreq.arp_pa;
    sin->sin_family = AF_INET;
    sin->sin_addr.s_addr = inet_addr(IP);

    s = socket(AF_INET, SOCK_DGRAM, 0);
    if (s < 0) {
        perror("socket");
        exit(0);
    }
    if (ioctl(s, SIOCGARP, &arpreq) < 0) {
        perror("ioctl");
        exit(0);
    }
    printf("IP address:       %s\n", inet_ntoa(sin->sin_addr));

    if (arpreq.arp_flags & ATF_COM) {
        eap = (unsigned char *) &arpreq.arp_ha.sa_data[0];
        printf("Ethernet address: %02X:%02X:%02X:%02X:%02X:%02X",
                eap[0], eap[1], eap[2], eap[3], eap[4], eap[5]);
        if (arpreq.arp_flags & ATF_PERM) printf(" PERM");
        if (arpreq.arp_flags & ATF_PUBL) printf(" PUBLISHED");
        if (arpreq.arp_flags & ATF_USETRAILERS) printf(" TRAILERS");
        if (arpreq.arp_flags & ATF_PROXY) printf(" PROXY");
        printf("\n");
    } else {
        printf("*** INCOMPLETE ***\n");
    }
    close(s);
}

Как вариант, можно распарсить /proc/net/arp, но хотелось бы обойтись без этого.



Последнее исправление: JB (всего исправлений: 2)

вангую, что ты этим кодом хочешь получить мак устройства из другой подсети. так не получится.

//лапшу не читал
под рутом, надеюсь, запускаешь бинарь-то получившийся?

aol ★★★★★
()

root не нужен, но

strcpy(arpreq.arp_dev, "eth0"); // например

перед ioctl() надо.

P.S. на printf(«IP address: %s\n», inet_ntoa(sin->sin_addr)); все равно упадет.

dmiceman ★★★★★
()
Ответ на: комментарий от aol

Нет, подсеть та же. Бинарник запускается из-под root.

jockerface
() автор топика
Ответ на: комментарий от jockerface

на printf не упало.

Да, прошу прощения, это я ерунду написал. Не должно было падать.

dmiceman ★★★★★
()
Ответ на: комментарий от true_admin

пингануть забыл, таблица пуста если используются свичи

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.