c - 如何在不关心 MAC 地址的情况下使用 packet_mmap 发送 SOCK_DGRAM 数据包?

标签 c linux-kernel network-programming mmap ethernet

我想使用 packet_mmap 发送数据包以获得高数据包传输率。我设法在原始模式下使用数据包套接字发送数据包,为此我在缓冲区中创建了 L2、L3 等并使用

sendto(fd_socket, NULL, 0, 0, NULL, sizeof(struct sockaddr_ll));

但是,我不想为目标 mac 地址操心。所以我转而使用 Dgram。如果我想使用 sendto,则有一个目标 MAC 地址的参数。尽管这不是我所希望的不关心 arp 缓存和指定目的地的 MAC 地址:

sendto(fd_socket, NULL, 0, 0, (struct sockaddr *) ps_sockaddr, sizeof(struct sockaddr_ll));

但是我发现 send 也可以与 packet socket 一起使用。 http://man7.org/linux/man-pages/man7/packet.7.html 因此,我用 ip header 等填充了缓冲区。在这种情况下,发送返回零,因为没有发现要发送的内容,如果数据包传输出现错误,我希望它不是零。

有没有办法在不关心 L2 地址的情况下使用 packet_mmap?

最佳答案

没有。当您在SOCK_DGRAM 模式下使用数据包套接字时,您无需构造L2 header ,但您仍必须提供L2 地址,然后系统会为您构造 header 。 (这样实际上可以为您构建数据包的 L2 部分,您不需要指定源 MAC 地址,但您仍然需要指定要从中发送数据包的接口(interface)和目标 MAC 地址.)

否则系统如何知道将数据包发送到哪里?我相信您希望系统会查看您已经在数据包缓冲区中构建的 IP header ,然后代表您进行接口(interface)选择和 ARP 查找,但是通过使用数据包套接字,您正在绕过网络堆栈的那部分。 (另外,如果 IP 地址不在本地 LAN 上,则需要一个路由步骤——通常只是为它的 MAC 地址找到默认网关和 ARPing。)

现在您可以使用原始 套接字 ( http://man7.org/linux/man-pages/man7/raw.7.html ) 获得大部分(我认为)您想要的东西。在这种情况下,您是在告诉内核您正在使用 IP 但不依赖于任何更高层 (> L3)。在这种情况下,您还可以构建自己的 IP header ,并使用 IP_HDRINCL 选项根据它做出路由决策。

关于c - 如何在不关心 MAC 地址的情况下使用 packet_mmap 发送 SOCK_DGRAM 数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46071266/

相关文章:

c - 在 Minix 中 fork 后执行 mkdir 后创建的奇怪目录(USER=root)

c - 输入的值未写入数组

linux - Maven 不再使用新内核

c++ - Linux系统调用+交叉编译

c - 简单的 UDP 服务器不能接受数据包

gethostbyname() 可以返回 IPv6 地址吗?

c - 可移植 ISR 安全数据传递

c - 技巧 C 编译器将整个结构分配给零,没有 for 循环

linux - UDP 数据包丢弃 - INErrors 与 .RcvbufErrors

rest - 非 RESTful 与 RESTful