与 msghdr 结构中的 msg_name 字段混淆
Be confused with msg_name field in msghdr structure
在用户 space 中,我使用 sock_raw
(包括 IP header)封装了一个 L3 数据包,并使用 sock_sendmsg()
发送给内核 space 使用 msghdr
结构
struct msghdr {
void *msg_name; /* optional address */
struct iovec *msg_iov; /* scatter/gather array */
...
};
我无法理解msg_name
的作用。我已经在 L3 header 中指定了源 IP 和目标 IP。为什么我需要 msg_name
?
struct msghdr
的 msg_name
和 msg_namelen
字段与 sendto
的 dest_addr
和 addrlen
参数具有相同的功能:它们指定目的地地址。它们旨在与 正常 未连接的数据报套接字一起使用。例如,当在 AF_INET
/SOCK_DGRAM
套接字上发送带有 sendmsg
的 UDP 数据包时,您只提供有效载荷,而不是 iovec 中的 headers 和目标地址进入 msg_name
+ msg_namelen
.
raw(7)
,描述 SOCK_RAW
套接字的联机帮助页,表明您 允许将 header 放入 iovec
在使用原始套接字时(特别注意 IP_HDRINCL
的讨论),但不清楚在这种情况下应该将 msg_name
和 msg_namelen
设置为什么。我建议您尝试将它们都设置为 0,看看是否可行。
在用户 space 中,我使用 sock_raw
(包括 IP header)封装了一个 L3 数据包,并使用 sock_sendmsg()
发送给内核 space 使用 msghdr
结构
struct msghdr {
void *msg_name; /* optional address */
struct iovec *msg_iov; /* scatter/gather array */
...
};
我无法理解msg_name
的作用。我已经在 L3 header 中指定了源 IP 和目标 IP。为什么我需要 msg_name
?
struct msghdr
的 msg_name
和 msg_namelen
字段与 sendto
的 dest_addr
和 addrlen
参数具有相同的功能:它们指定目的地地址。它们旨在与 正常 未连接的数据报套接字一起使用。例如,当在 AF_INET
/SOCK_DGRAM
套接字上发送带有 sendmsg
的 UDP 数据包时,您只提供有效载荷,而不是 iovec 中的 headers 和目标地址进入 msg_name
+ msg_namelen
.
raw(7)
,描述 SOCK_RAW
套接字的联机帮助页,表明您 允许将 header 放入 iovec
在使用原始套接字时(特别注意 IP_HDRINCL
的讨论),但不清楚在这种情况下应该将 msg_name
和 msg_namelen
设置为什么。我建议您尝试将它们都设置为 0,看看是否可行。