recvfrom的以太网报头不如预期

recvfrom的以太网报头不如预期

问题描述:

我正在编写一些网络包嗅探代码(在以太网LAN上运行)。在试图打印出以太网头时,我遇到了一些困惑。根据Wikipedia,前8个字节由前导码和分隔符组成,接下来的6个是MAC目的地址。recvfrom的以太网报头不如预期

但是,当我真正运行我的代码时,我看到在从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个字节之后已经得到正确的结果。

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

此打印正确的目的地地址,而我应该有 通过在缓冲

前同步码是一个非常低的层次的概念跳过前8个字节 后打印得到正确的结果, 由NIC严格处理。它甚至不可见的操作系统,更不用说由recvfrom返回。

+0

谢谢。你能指出我对此的任何链接/书籍吗?我所提到的大多数标准网络教科书都没有这方面的内容 - 正如我现在发现的那样,这个问题很模糊。 – talonx 2013-04-07 08:47:26

+0

@talonx我想不出任何教科书。这只是几年前我想知道的,有人告诉我(并在Unix内核中显示了我)。 – cnicutar 2013-04-07 08:48:43

+2

@talonx查阅关于libpcap和tcpdump的文档,以了解这种常见的东西。我的经验法则是任何不能用于libpcap/tcpdump的数据包信息都不适用于我。如果你看到libpcap/tcpdump能够做到这一点,你不知道该怎么做,那么在论坛上提出问题并且说出如“我想要做x; libpcap做x,我会像libpcap一样做x吗?“ – 2to1mux 2013-04-07 18:57:25