首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有AF_PACKET / PF_PACKET的recvfrom()套接字地址类型

具有AF_PACKET / PF_PACKET的recvfrom()套接字地址类型
EN

Stack Overflow用户
提问于 2011-05-26 15:11:16
回答 2查看 3.3K关注 0票数 3

在两台PC上,我正在打开一个AF_PACKET / PF_PACKET套接字,原始协议。

sock =套接字(AF_PACKET,SOCK_RAW,hton(PROTO_BULK))

(编辑: PROTO_BULK是一个虚拟类型,由我自己为这个测试创建。我不认为这是与这个问题有关,但我可能错了。)

第一台PC以标准的send()方式向另一方发送数据包,在另一侧接收该数据包时:

recvfrom(sock,buffer,1600,0,( sockaddr*) &from,&fromlen);

我现在的问题是:"from“中的数据类型是什么?下面是我所收到的一个例子:

00 00 00 f8 a1 00 58 1d a1 00 94 60

从长度和内容来看,它既不像“sockaddr”,也不像"sockaddr_ll“。有什么想法吗?

我实际上是在寻找数据包被接收到的接口。我可以使用来自数据包的目标MAC并从它识别接口,但是它不能与广播数据包一起工作。

我正在运行一个最近的Linux内核(我不想研究内核源代码!)。

编辑:,我的代码错了。我没有用"from“缓冲区大小初始化”from did“,所以我假设存在一些伪值,而且"recvfrom()”不能正确地完成它的工作。感谢below为我指出了这个错误,他的评论如下!当然,我的问题中没有包括错误代码的这一部分,因为很明显,这样简单的代码不会有任何错误。

使用正确的参数,我得到一个"struct sockaddr_ll“正确填充,包括我正在寻找的接口编号。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-26 16:18:45

,我实际上是在寻找数据包被接收到的接口。

您应该使用recvmsg,它允许访问元数据,例如数据包的目标地址(对于多主机系统很有用),我认为接口也是如此。

你现在看到的发件人地址不会告诉你界面。不过,它可以用sendto发送回复包。

票数 3
EN

Stack Overflow用户

发布于 2011-05-26 15:32:43

我看了一下内核源代码。我并不完全理解他们,但是.

是PROTO_BULK 37984 (0x9460)吗?

如果是这样的话,这可能是一个"struct sockaddr_pkt“。(无论如何,它的尺寸是对的。)虽然我不知道其他字节是什么意思。如果我正确地读取了代码,它们应该是接收数据包的接口的“名称”。所以我可能读错了代码。

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

https://stackoverflow.com/questions/6140867

复制
相关文章

相似问题

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