与msghdr结构

时间:2017-05-27 18:16:38

标签: c linux networking network-programming embedded-linux

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

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

我无法清楚地理解msg_name的角色。我已在L3标头中指定了源IP和目标IP。为什么我需要msg_name

1 个答案:

答案 0 :(得分:2)

msg_name的{​​{1}}和msg_namelen字段与sendtostruct msghdrdest_addr参数具有相同的功能:它们指定了目的地址。它们旨在与普通未连接的数据报套接字一起使用。例如,在addrlen / sendmsg套接字上发送AF_INET的UDP数据包时,只提供iovec中的有效负载而不是标头,目标地址进入{{ 1}} + SOCK_DGRAM

raw(7),描述msg_name套接字的联机帮助页,表示您 允许在使用原始套接字时将标头放入msg_namelen(特别注意)关于SOCK_RAW)的讨论,但没有说明在这种情况下您应该设置iovecIP_HDRINCL的内容。我建议你尝试将它们都设置为0,看看是否有效。