我在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));
我还需要确定数据包包含的协议。我如何进入具有该数据包的数据包段?它是标题中的剩余两个字节吗?
我非常感谢您应该注意的任何其他事项。
答案 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(ð->destAddr));
printf("Source MAC: %s\n", ether_ntoa(ð->sourceAddr));
(在你的情况下发生了什么,目的地地址放入了destAddr[0]
,
源地址转换为destAddr[1]
,协议转换为第一个字节
destAddr[2]
。)