来自recvfrom()的套接字地址类型,带有AF_PACKET / PF_PACKET

时间:2011-05-26 15:11:17

标签: c linux sockets

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

  

sock = socket(AF_PACKET,SOCK_RAW,htons(PROTO_BULK))

(编辑:PROTO_BULK是一个虚拟类型,由我自己为此测试创建。我不认为它会推断出这个问题,但我可能错了。)

第一台PC以另一方标准send()方式向另一方发送数据包:

  

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

我现在的问题是:“来自”的数据类型是什么?以下是我收到的例子:

  <00> 00 00 00 00 00 00 00 00 f8 cd a1 00 58 1d a1 00 94 60

从长度和内容来看,它看起来不像“struct sockaddr”,也不像“sockaddr_ll”。任何的想法?

我实际上是在寻找收到数据包的接口。我可以使用数据包中的目标MAC并从中识别接口,但它不适用于广播数据包。

我正在运行最新的Linux内核(我不想在内核源代码中进行调查!)。

编辑:我的代码错了。我没有用“from”缓冲区大小初始化“fromlen”,所以我认为有一些虚假值,“recvfrom()”无法正常工作。感谢Ben Voigt在下面的评论中指出了这个错误!当然,我没有在我的问题中包含这部分错误的代码,因为很明显这样简单的代码可能没有错误......

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

2 个答案:

答案 0 :(得分:3)

  

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

您应该使用recvmsg,它可以访问元数据,例如数据包的目标地址(对多宿主系统很有用),我认为也是界面。

您现在正在查看的发件人地址并不会告诉您界面。发送带sendto的回复数据包非常方便。

答案 1 :(得分:1)

我瞥了一眼核心来源。我并不是要完全理解它们,而是......

PROTO_BULK 37984(0x9460)?

如果是这样,这可能是“struct sockaddr_pkt”。 (无论如何,它的大小都合适。)虽然我不确定其他字节是什么意思。如果我正确地读取代码,它们应该是接收数据包的接口的“名称”。所以我可能错误地阅读了代码。