繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM