- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在两台 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/
我对 AF_PACKET 套接字系列(用于 SOCK_RAW 套接字)与以太网 (IEEE 802.3) 的具体关系感到非常困惑。 目前我的理解: 我了解 OSI 模型,以及第 2 层技术如何像以太网
sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); setsockopt(sock, SOL_SOCKET, SO_ATTACH_FILTER,
在 Linux 上,可以使用 AF_PACKET 创建一个套接字,以从套接字接收原始数据并在应用程序中进行 IP 过滤。但是 OSX 的手册页没有这个: PF_LOCAL
我在尝试让 wpa_supplicant 在运行自定义嵌入式 Linux 发行版的板上运行时遇到了问题。经过一些调试,原来是因为内核不支持域类型PF_PACKET: drv->eapol_tx_soc
如何在不指定数据绑定(bind)到哪个主机的情况下在 SOCK_PACKET 套接字上发送数据?我已经构建了 IP header 以显示它应该去哪里,但是 write() 不起作用。 最佳答案 不要。
正如 this question 所暗示的那样,似乎校验和是由以太网硬件计算和验证的,因此当使用 AF_PACKET 套接字发送帧时,它似乎不太可能必须由软件生成,看起来 here和 here .另外
我试图使用 AF_PACKET 原始套接字嗅探网络流量。我能够获取所有 IP/ARP 数据包,但根本无法获取任何 IPv6 数据包。我需要做什么才能获得 IPv6 流量吗? unsigned c
我想不通。当我运行我的代码时......即使我绑定(bind)成功,我也会看到来自所有以太网类型和所有接口(interface)的数据。运行几分钟后……它会自行修复。然后我只从一个特定的接口(inte
使用以下方法使用 AF_PACKET 和环形缓冲区(伪 C)捕获数据包: // Set up socket fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_A
我正在使用 Python 构建数据包嗅探程序,但是我遇到了减速带。出于某种原因,我认为套接字没有正确导入,因为我在程序运行时收到以下消息:AttributeError: module 'socket'
关闭创建为AF_PACKET 和AF_INET 的套接字之间存在这种时间差异的原因是什么?如何减少 AF_PACKET 的关闭时间? sockfd = socket(AF_PACKET, SOCK_R
我想编写一个应用程序,它应该接收所有传入的数据包,而不管数据包是发往我的机器并假设被转发还是发往本地主机。 为此,我打开了一个 AF_PACKET 套接字。但是,由于我的机器有多个接口(interfa
在两台 PC 上,我正在打开一个 AF_PACKET/PF_PACKET 套接字,原始协议(protocol)。 sock = socket(AF_PACKET, SOCK_RAW, htons(PR
下面的 Linux 代码应该搜索所有接口(interface),直到它使用 ETHERNET 类型 2 帧从特定 MAC 地址获得响应。 尚未完成。 我希望 select() 阻止超时值。问题是没有数
我正在尝试在 Linux (Ubuntu 18.04) 上的 C 中创建一个测试程序,该程序使用 SOCK_RAW 通过 AF_PACKET/PF_PACKET 套接字发送一个空的 UDP 数据包.在
我是一名优秀的程序员,十分优秀!