在用户空间中,我使用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
?
答案 0 :(得分:2)
msg_name
的{{1}}和msg_namelen
字段与sendto
的struct msghdr
和dest_addr
参数具有相同的功能:它们指定了目的地址。它们旨在与普通未连接的数据报套接字一起使用。例如,在addrlen
/ sendmsg
套接字上发送AF_INET
的UDP数据包时,只提供iovec中的有效负载而不是标头,目标地址进入{{ 1}} + SOCK_DGRAM
。
raw(7)
,描述msg_name
套接字的联机帮助页,表示您 允许在使用原始套接字时将标头放入msg_namelen
(特别注意)关于SOCK_RAW
)的讨论,但没有说明在这种情况下您应该设置iovec
和IP_HDRINCL
的内容。我建议你尝试将它们都设置为0,看看是否有效。