【问题标题】:Getting Source MAC Address from ether_addr从 ether_addr 获取源 MAC 地址
【发布时间】: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__));

标签: c ethernet libpcap


【解决方案1】:

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].)

【讨论】:

  • 谢谢,它成功了。在另一个问题中,对于 IP 和 TCP 标头,我将如何仅隔离校验和部分?我最初想使用按位运算,但后来我意识到这意味着将掩码移动超过 32 位,这在 C 中似乎是不允许的。
  • @user2259530:我不知道,所以我建议你开始一个新的问题。 - 如果此答案解决了您的问题,请考虑通过单击复选标记“接受”它。
猜你喜欢
  • 2014-11-22
  • 1970-01-01
  • 2011-02-14
  • 2013-09-18
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多