sendmsg或sendmmsg用于纯L2数据包

时间:2014-07-09 09:51:36

标签: c sockets

我想使用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等...)

有些人可以帮助我............

1 个答案:

答案 0 :(得分:0)

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

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

您还可能需要有一个通信通道(netlink socket或简单的char驱动程序),用于在用户级应用程序和内核模块之间进行通信。
像send,sendmsg这样的套接字调用无助于你正在尝试的事情。