我想使用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;
};
我是否必须明确更新此struct msghdr中的接口索引或SRC MAC或目标MAC。
我在iov_base中分配的数据是竞争L2帧(与src和dest MAC等...)
有些人可以帮助我............
答案 0 :(得分:0)
原始套接字允许发送L3数据包,即绕过L4传输层的IP层数据包 防爆。 ICMP协议使用RAW套接字。
如果你需要发送一个L2数据包,你需要有内核模块,它分配一个skb(套接字缓冲区)并填充ex,SOURCE mac,DESTINATION mac,协议类型,传出接口的所有细节并将其交给通过适当的接口传输的驱动程序。
您还可能需要有一个通信通道(netlink socket或简单的char驱动程序),用于在用户级应用程序和内核模块之间进行通信。
像send,sendmsg这样的套接字调用无助于你正在尝试的事情。