【问题标题】: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 msghdr 的 msg_name 和 msg_namelen 字段与 sendto 的 dest_addr 和 addrlen 参数具有相同的功能:它们指定目标地址。它们旨在与正常未连接的数据报套接字一起使用。例如,当在AF_INET/SOCK_DGRAM 套接字上发送带有sendmsg 的UDP 数据包时,您在iovec 中仅提供有效负载,而不提供标头,并且目标地址位于msg_name + msg_namelen。
raw(7),描述SOCK_RAW 套接字的手册页,表明您被允许在使用原始套接字时将标头放入iovec(特别注意IP_HDRINCL 的讨论) 但没有明确说明在这种情况下您应该将 msg_name 和 msg_namelen 设置为什么。我建议您尝试将它们都设置为 0,看看是否可行。