从ether_addr获取源MAC地址

时间:2014-01-12 08:10:11

标签: c ethernet libpcap

我在C中编写一个程序,使用libpcap读取数据包,然后输出目标和源地址等信息。我是网络编程的新手,所以我无法理解我得到的输出差异。我总是得到正确的目标MAC地址,但源地址不正确。

以下是预期的输出:

包号码:1包Len:42 Dest MAC:ff:ff:ff:ff:ff:ff 来源MAC:0:2:2d:90:75:89

这是我的输出:

包Len:42 Dest MAC:ff:ff:ff:ff:ff:ff 来源MAC:0:0:c0:a8:1:1

我知道在以太网头中,源地址紧跟在目标地址之后,所以我创建了自己的结构来反映这一点:

typedef struct __attribute__((__packed__)) EtherHeader {
   const struct ether_addr destAddr[6];
   const struct ether_addr sourceAddr[6];
   uint8_t protocol; 
}EtherHeader;

以下是我的代码片段,它试图获取地址:

char *fileName = argv[1];
char errbuf[100];
const struct EtherHeader *eth;

pcap_t *handle = pcap_open_offline(fileName, errbuf);
struct pcap_pkthdr pktHdr = calloc(1, sizeof(struct pcap_pkthdr));
const u_char *nextPkt = pcap_next(handle, pktHdr); 
int packNum = 0;

nextPkt = pcap_next(handle, pktHdr); 
printf("Packet number: %d  Packet Len: %d\n", packNum, pktHdr->len);
eth = (EtherHeader *)nextPkt;
printf("Dest MAC: %s\n", ether_ntoa(eth->destAddr));
printf("Source MAC: %s\n", ether_ntoa(eth->sourceAddr));

我还需要确定数据包包含的协议。我如何进入具有该数据包的数据包段?它是标题中的剩余两个字节吗?

我非常感谢您应该注意的任何其他事项。

1 个答案:

答案 0 :(得分:4)

struct ether_addr已经被定义为包含6个字节的结构,所以你 应该替换

const struct ether_addr destAddr[6];
const struct ether_addr sourceAddr[6];

通过

const struct ether_addr destAddr;
const struct ether_addr sourceAddr;

请注意,在打印EtherNet地址时,您需要一个地址操作员&

printf("Dest MAC: %s\n", ether_ntoa(&eth->destAddr));
printf("Source MAC: %s\n", ether_ntoa(&eth->sourceAddr));

(在你的情况下发生了什么,目的地地址放入了destAddr[0], 源地址转换为destAddr[1],协议转换为第一个字节 destAddr[2]。)