在两台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”,包括我正在寻找的接口号。
答案 0 :(得分:3)
我实际上是在寻找接收数据包的接口。
您应该使用recvmsg
,它可以访问元数据,例如数据包的目标地址(对多宿主系统很有用),我认为也是界面。
您现在正在查看的发件人地址并不会告诉您界面。发送带sendto
的回复数据包非常方便。
答案 1 :(得分:1)
我瞥了一眼核心来源。我并不是要完全理解它们,而是......
PROTO_BULK 37984(0x9460)?
如果是这样,这可能是“struct sockaddr_pkt”。 (无论如何,它的大小都合适。)虽然我不确定其他字节是什么意思。如果我正确地读取代码,它们应该是接收数据包的接口的“名称”。所以我可能错误地阅读了代码。