![](/img/trans.png)
[英]When using PF_PACKET type of socket, what does PACKET_ADD_MEMBERSHIP?
[英]Type of socket address from recvfrom() with AF_PACKET / PF_PACKET
在两台 PC 上,我打开一个 AF_PACKET / PF_PACKET 套接字,原始协议。
袜子 = 套接字(AF_PACKET,SOCK_RAW,htons(PROTO_BULK))
(编辑:PROTO_BULK 是一个虚拟类型,由我自己为此测试创建。我不希望它推断出这个问题,但我可能是错的。)
第一台 PC 以标准的 send() 方式向另一台 PC 发送一个数据包,另一端通过以下方式接收该数据包:
recvfrom(sock, buffer, 1600, 0, (struct sockaddr*) &from, &fromlen);
我现在的问题是:“from”中的数据类型是什么? 这是我收到的一个例子:
00 00 00 00 00 00 00 00 f8 cd a1 00 58 1d a1 00 94 60
从长度和内容来看,它既不像“struct sockaddr”,也不像“sockaddr_ll”。 任何想法?
我实际上正在寻找接收数据包的接口。 我可以使用数据包中的目标 MAC 并从中识别接口,但它不适用于广播数据包。
我正在运行最近的 Linux kernel (我不想在 kernel 来源中进行调查。)。
编辑:我的代码是错误的。 我没有用“from”缓冲区大小初始化“fromlen”,所以我认为存在一些虚假值,并且“recvfrom()”无法正确完成其工作。 感谢 Ben Voigt 在下面的评论中指出了这个错误,当然,我没有在我的问题中包含这部分错误代码。 很明显,这样简单的代码不会出错......
使用正确的参数,我得到一个正确填充的“struct sockaddr_ll”,包括我正在寻找的接口号。
我实际上正在寻找接收数据包的接口。
您应该使用recvmsg
,它可以访问元数据,例如数据包的目标地址(对多宿主系统很有用),我认为也是接口。
您现在正在查看的发件人地址不会告诉您界面。 不过,用sendto
发送回复数据包很有用。
我看了一眼 kernel 源。 我并不声称完全理解它们,但是...
PROTO_BULK 是 37984 (0x9460) 吗?
如果是这样,这可能是一个“struct sockaddr_pkt”。 (无论如何,它的大小是正确的。)虽然我不确定其他字节是什么意思。 如果我正确阅读代码,它们应该是接收数据包的接口的“名称”。 所以我可能错误地阅读了代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.