【问题标题】:Be confused with msg_name field in msghdr structure与 msghdr 结构中的 msg_name 字段混淆
【发布时间】:2017-05-27 18:16:37
【问题描述】:

在用户空间,我使用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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 2015-12-12
      • 2014-07-09
      • 1970-01-01
      相关资源
      最近更新 更多