+-
来自带有AF_PACKET / PF_PACKET的recvfrom()的套接字地址类型
在两台PC上,我打开一个原始协议AF_PACKET / PF_PACKET套接字.

sock = socket(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内核(并且我不想在内核源代码中进行调查!).

编辑:我的代码是错误的.我没有使用“ from”缓冲区大小初始化“ fromlen”,所以我认为这里存在一些虚假值,并且“ recvfrom()”无法正确执行其工作.感谢Ben Voigt在下面的评论中向我指出了这个错误!当然,我没有在问题中包括这部分错误代码,因为很明显,使用这样简单的代码不会有任何错误…

使用正确的参数,我可以正确填充“ struct sockaddr_ll”,包括我要查找的接口号.

最佳答案

I am actually looking for the interface the packet was received on.

您应该使用recvmsg,它可以访问元数据,例如数据包的目标地址(适用于多宿主系统),而且我认为也是接口.

您现在正在查看的发件人地址不会告诉您界面.不过,这对于发送带有sendto的回复数据包很有用.

点击查看更多相关文章

转载注明原文:来自带有AF_PACKET / PF_PACKET的recvfrom()的套接字地址类型 - 乐贴网