来自recvfrom的以太网报头不是预期的

时间:2013-04-07 08:41:39

标签: c network-programming ethernet

我在C中编写一些网络数据包嗅探代码(在以太网LAN上运行)。在尝试打印以太网报头时,我遇到了一些困惑。根据{{​​3}},前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个字节后,我应该通过打印获得正确的结果。

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

1 个答案:

答案 0 :(得分:2)

  

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

序言是一个非常低级的概念,严格按NIC 处理。操作系统甚至看不到它,更不用说recvfrom返回了。