gpt4 book ai didi

c - 用于纯 L2 数据包的 sendmsg 或 sendmmsg

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:36 26 4
gpt4 key购买 nike

我想使用 RAW 套接字发送纯 L2 数据包。由于我希望在单个 SEND 系统调用中发送多个数据包,因此我打算使用 sendmmsg。

我了解如何分配缓冲区并填充 struct msghdr 和 struct iovec。但我总是从 sendmmsg 收到错误消息“没有这样的设备或地址”

除了 iov 和 iovlen 之外,我是否必须更新此结构的任何其他成员

struct msghdr 
{
void *msg_name;
socklen_t msg_namelen;
struct iovec *msg_iov;
size_t msg_iovlen;
void *msg_control;
size_t msg_controllen;
int msg_flags;
};

我是否必须明确更新此结构 msghdr 中的接口(interface)索引或 SRC MAC 或目标 MAC。

我在 iov_base 中分配的数据是竞争 L2 帧(带有 src 和 dest MAC 等。)

有人能帮我吗......................

最佳答案

原始套接字允许发送 L3 数据包,即绕过 L4 传输层的 IP 层数据包。
前任。 ICMP 协议(protocol)使用 RAW 套接字。

如果你需要发送一个 L2 数据包,你需要有一个内核模块,它分配一个 skb(套接字缓冲区)并填充 ex,SOURCE mac,DESTINATION mac,协议(protocol)类型,传出接口(interface)的所有细节并将它交给通过适当接口(interface)传输的驱动程序。

您可能还需要一个通信 channel (netlink 套接字或简单的字符驱动程序),以便在您的用户级应用程序和内核模块之间进行通信。
send、sendmsg 等套接字调用无助于执行您正在尝试的操作。

关于c - 用于纯 L2 数据包的 sendmsg 或 sendmmsg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24650462/

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