【发布时间】:2014-01-12 08:10:10
【问题描述】:
我正在用 C 语言编写一个程序,它使用 libpcap 读取数据包,然后输出目标地址和源地址等信息。我是网络编程的新手,所以我无法理解我得到的输出差异。我总是得到正确的目标 MAC 地址,但不正确的源地址。
以下是预期的输出:
数据包数:1 数据包长度:42 目标 MAC:ff:ff:ff:ff:ff:ff 源 MAC:0:2:2d:90:75:89
这是我的输出:
数据包长度:42 目标 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;
这是我尝试获取地址的代码的 sn-p:
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));
我还需要确定数据包包含什么协议。我将如何到达具有它的数据包段?是header中剩下的两个字节吗?
非常感谢我应该注意的任何其他事项。
【问题讨论】:
-
请注意,在 Linux 上
struct ether_header已在/usr/include/net/ethernet.h中定义:struct ether_header { u_int8_t ether_dhost[ETH_ALEN]; /* destination eth addr */ u_int8_t ether_shost[ETH_ALEN]; /* source ether addr */ u_int16_t ether_type; /* packet type ID field */ } __attribute__ ((__packed__));