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
返回。
谢谢。你能指出我对此的任何链接/书籍吗?我所提到的大多数标准网络教科书都没有这方面的内容 - 正如我现在发现的那样,这个问题很模糊。 – talonx 2013-04-07 08:47:26
@talonx我想不出任何教科书。这只是几年前我想知道的,有人告诉我(并在Unix内核中显示了我)。 – cnicutar 2013-04-07 08:48:43
@talonx查阅关于libpcap和tcpdump的文档,以了解这种常见的东西。我的经验法则是任何不能用于libpcap/tcpdump的数据包信息都不适用于我。如果你看到libpcap/tcpdump能够做到这一点,你不知道该怎么做,那么在论坛上提出问题并且说出如“我想要做x; libpcap做x,我会像libpcap一样做x吗?“ – 2to1mux 2013-04-07 18:57:25