gpt4 book ai didi

c - 从 ether_addr 获取源 MAC 地址

转载 作者:太空宇宙 更新时间:2023-11-04 01:31:56 25 4
gpt4 key购买 nike

我正在用 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

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

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));

我还需要确定数据包包含什么协议(protocol)。我将如何到达具有该数据包的数据包段?是header中剩下的两个字节吗?

我将不胜感激任何我应该注意的额外事项。

最佳答案

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],协议(protocol)放入第一个字节destAddr[2].)

关于c - 从 ether_addr 获取源 MAC 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21072618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com