与 msghdr 结构中的 msg_name 字段混淆

Be confused with msg_name field in msghdr structure

在用户 space 中,我使用 sock_raw(包括 IP header)封装了一个 L3 数据包,并使用 sock_sendmsg() 发送给内核 space 使用 msghdr结构

struct msghdr {
    void         *msg_name;       /* optional address */
    struct iovec *msg_iov;        /* scatter/gather array */
    ...
};

我无法理解msg_name的作用。我已经在 L3 header 中指定了源 IP 和目标 IP。为什么我需要 msg_name

struct msghdrmsg_namemsg_namelen 字段与 sendtodest_addraddrlen 参数具有相同的功能:它们指定目的地地址。它们旨在与 正常 未连接的数据报套接字一起使用。例如,当在 AF_INET/SOCK_DGRAM 套接字上发送带有 sendmsg 的 UDP 数据包时,您只提供有效载荷,而不是 iovec 中的 headers 和目标地址进入 msg_name + msg_namelen.

raw(7),描述 SOCK_RAW 套接字的联机帮助页,表明您 允许将 header 放入 iovec 在使用原始套接字时(特别注意 IP_HDRINCL 的讨论),但不清楚在这种情况下应该将 msg_namemsg_namelen 设置为什么。我建议您尝试将它们都设置为 0,看看是否可行。