在用户空间中,我使用 sock_raw
封装了一个 L3 数据包(包括 IP header ),并使用 sock_sendmsg()
使用 msghdr
发送到内核空间> 结构
struct msghdr {
void *msg_name; /* optional address */
struct iovec *msg_iov; /* scatter/gather array */
...
};
我无法清楚地理解msg_name
的作用。我已经在 L3 header 中指定了源 IP 和目标 IP。为什么需要 msg_name
?
最佳答案
msg_name
和msg_namelen
struct msghdr
的字段与 dest_addr
具有相同的功能和addrlen
sendto
的参数:它们指定目标地址。它们旨在与正常未连接的数据报套接字一起使用。例如,当发送带有 sendmsg
的 UDP 数据包时在AF_INET
上/SOCK_DGRAM
套接字,您在 iovec 中仅提供有效负载,而不提供 header ,并且目标地址位于 msg_name
中。 + msg_namelen
.
raw(7)
,描述 SOCK_RAW
的联机帮助页套接字,表示您可以将 header 放入 iovec
当使用原始套接字时(特别注意 IP_HDRINCL
的讨论)但没有明确您应该设置 msg_name
的内容和msg_namelen
在那种情况下。我建议您尝试将它们都设置为 0,看看是否有效。
关于c - 与 msghdr 结构中的 msg_name 字段混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44220221/