我想使用原始套接字发送纯L2数据包。由于我希望在单个send系统调用中发送多个数据包,因此我打算使用sendmmsg。
我知道如何分配buffer和填充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中显式更新接口索引或SRC MAC或目标MAC。
我在iov_base中分配的数据是竞争L2帧(具有源和目的MAC等)。
能不能帮我个忙............
发布于 2014-07-09 18:52:51
原始套接字允许发送L3数据包,即绕过L4传输层的IP层数据包。
例如。ICMP协议使用原始套接字。
如果你需要发送一个L2数据包,你需要有一个内核模块,它分配一个skb(套接字缓冲区),并填充所有关于ex、源mac、目的mac、协议类型、传出接口的详细信息,并将其传递给驱动程序,以便通过适当的接口进行传输。
您可能还需要一个通信通道(netlink套接字或简单字符驱动程序),以便在用户级应用程序和内核模块之间进行通信。
像send、sendmsg这样的套接字调用对您正在尝试的操作没有帮助。
https://stackoverflow.com/questions/24650462
复制相似问题