0

我正在用 C 编写一些网络数据包嗅探代码(在以太网 LAN 上运行)。在尝试打印以太网标头时,我遇到了一些困惑。根据维基百科,前 8 个字节由前导码和分隔符组成,接下来的 6 个字节是 MAC 目标地址。

然而,当我实际运行我的代码时,我发现在我从 recvfrom 调用中获得的字节中,最初的 8 个字节(前导码和定界符)丢失了。换句话说,我可以从第一个字节本身开始读取目标地址。

这是代码的相关部分

char buffer[BUFFERSIZE];
struct addrinfo servinfo;

servinfo.ai_family = PF_PACKET;
servinfo.ai_socktype = SOCK_RAW;
servinfo.ai_protocol = htons(ETH_P_ALL);

int fd = socket(servinfo.ai_family, servinfo.ai_socktype, servinfo.ai_protocol);
int plen = recvfrom(fd, buffer, BUFFERSIZE, 0, &caddr, &clen);
int c = 0;
printf("Destination Address: %02x:%02x:%02x:%02x:%02x:%02x\n",buffer[c], buffer[c+1], buffer[c+2], buffer[c+3], buffer[c+4], buffer[c+5]);
printf("Source Address: %02x:%02x:%02x:%02x:%02x:%02x\n",buffer[c+6], buffer[c+7], buffer[c+8], buffer[c+9], buffer[c+10], buffer[c+11]);

这将打印正确的目标地址,而我应该在跳过缓冲区中的前 8 个字节后通过打印得到正确的结果。

我在这里错过了什么,或者做错了什么?

4

1 回答 1

2

这将打印正确的目标地址,而我应该在跳过缓冲区中的前 8 个字节后通过打印得到正确的结果

序言是一个非常底层的概念,由 NIC 严格处理。它甚至对操作系统都不可见,更不用说由recvfrom.

于 2013-04-07T08:43:43.663 回答