首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自recvfrom的以太网头与预期不符

来自recvfrom的以太网头与预期不符
EN

Stack Overflow用户
提问于 2013-04-07 16:41:39
回答 1查看 486关注 0票数 0

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

但是,当我实际运行代码时,我发现从recvfrom调用获得的字节中,缺少最初的8个字节(前导码和分隔符)。换句话说,我可以从第一个字节开始读取目标地址。

以下是代码的相关部分

代码语言:javascript
复制
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个字节后打印出正确的结果。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-07 16:43:44

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

前导码是一个非常低级的概念,严格由NIC处理。它甚至对操作系统都不可见,更不用说由recvfrom返回了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15860501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档