Существует две части к тому вопросу.
, Как для диспетчеризации на основе значения? Используйте оператор переключения. Это отображает Ваше намерение наиболее ясно.
, Когда для диспетчеризации на основе значения? Только в одном месте на значение: создайте полиморфный объект, который знает, как обеспечить ожидаемое поведение для значения.
1 минута поиска через google: (я сам не тестировал, Я сейчас работаю на машине с Windows)
/*
* gethwaddr.c
*
* Demonstrates retrieving hardware address of adapter using ioctl()
*
* Author: Ben Menking <bmenking@highstream.net>
*
*/
#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;
}
Есть отличная библиотека для управления Ethernet. Если вы хотите заняться низкоуровневыми вещами, это, безусловно, стоит изучить. Это довольно сложный API C для изучения.
Lib PCAP.
ссылка на lib pcap sourceforge
Пример кода:
#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);
}
}
Также есть хорошая "оболочка функций ядра", например библиотека: DNET
, который предоставляет широкие возможности для использования в сетях низкого уровня. (также получение MAC-адресов).
Имеются порты UNIX и win для обеих библиотек.