我正在用C编写一些网络包嗅探代码(在以太网LAN上运行)。在尝试打印以太网头时,我遇到了一点困惑。根据Wikipedia的说法,前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个字节后打印出正确的结果。
我在这里遗漏了什么,或者做错了什么?
发布于 2013-04-07 16:43:44
这会打印出正确的目标地址,而我应该在跳过缓冲区中的前8个字节后打印出正确的结果
前导码是一个非常低级的概念,严格由NIC处理。它甚至对操作系统都不可见,更不用说由recvfrom返回了。
https://stackoverflow.com/questions/15860501
复制相似问题