2009-10-05 23 views

Respuesta

26

de 1 minuto de la búsqueda throug Google: (no he probado yo mismo, estoy trabajando en una máquina Windows en el momento)

/* 
* gethwaddr.c 
* 
* Demonstrates retrieving hardware address of adapter using ioctl() 
* 
* Author: Ben Menking <[email protected]> 
* 
*/ 
#include <stdio.h> 
#include <sys/ioctl.h> 
#include <sys/types.h>  
#include <sys/socket.h> 
#include <net/if.h> 

int main(int argc, char *argv[]) 
{ 
    int s; 
    struct ifreq buffer; 

    s = socket(PF_INET, SOCK_DGRAM, 0); 

    memset(&buffer, 0x00, sizeof(buffer)); 

    strcpy(buffer.ifr_name, "eth0"); 

    ioctl(s, SIOCGIFHWADDR, &buffer); 

    close(s); 

    for(s = 0; s < 6; s++) 
    { 
     printf("%.2X ", (unsigned char)buffer.ifr_hwaddr.sa_data[s]); 
    } 

    printf("\n"); 

    return 0; 
}  
+0

De todos modos para obtenerlo sin hardcoding "eth0" ?? –

+0

Tiene que asignar un adaptador de red, de lo contrario no hay una dirección MAC, puede hacerlo por entrada o como argumento, pero necesitará un adaptador. –

+0

#include para cerrar() – notlesh

2

Hay una gran biblioteca para gestionar ethernet. Si quiere ir a cosas de bajo nivel, sin duda vale la pena aprender. C API es bastante difícil de aprender.

Lib PCAP.

link to lib pcap sourceforge

un código de ejemplo:

#include <pcap.h> 
#include <stdlib.h> 
#include <netinet/ip.h> 
#include <netinet/if_ether.h> 

void find_eth_addr(struct in_addr *search_ip, const struct pcap_pkthdr* pkthdr, const u_char *packet) { 
struct ether_header *eth_hdr = (struct ether_header *)packet; 

if (ntohs(eth_hdr->ether_type) == ETHERTYPE_IP) { 
    struct ip *ip_hdr = (struct ip *)(packet + sizeof(struct ether_header)); 
if (ip_hdr->ip_dst.s_addr == search_ip->s_addr) 
    print_eth_addr(eth_hdr->ether_dhost); 
if (ip_hdr->ip_src.s_addr == search_ip->s_addr) 
    print_eth_addr(eth_hdr->ether_shost); 

} 
} 

También hay buenas "las funciones del núcleo contenedor" como biblioteca: DNET

que proporciona una gran funcionalidad para usarlo en redes de bajo nivel . (también obteniendo direcciones MAC).

DNET

Hay UNIX puertos & ganar para ambas bibliotecas.

Cuestiones relacionadas