gpt4 book ai didi

c - 来自 recvfrom() 和 AF_PACKET/PF_PACKET 的套接字地址类型

转载 作者:太空狗 更新时间:2023-10-29 11:05:55 25 4
gpt4 key购买 nike

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

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”。任何的想法?

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

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

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

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

最佳答案

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

你应该使用 recvmsg ,它可以访问元数据,例如数据包的目标地址(对多宿主系统有用),我认为还有接口(interface)。

您现在查看的发件人地址不会告诉您界面。不过,使用 sendto 发送回复数据包很有用。

关于c - 来自 recvfrom() 和 AF_PACKET/PF_PACKET 的套接字地址类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6140867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com