c - 与 msghdr 结构中的 msg_name 字段混淆

标签 c linux networking network-programming embedded-linux

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

相关文章:

python - 二进制数据到图像原始python

C程序返回整数的数字之和

c - c 中的 fgets 和 strlen

c - 如何 "bypass"pthreads限制数量

ruby - 自包含 ruby "binary"?

mysql - 将 phpMyAdmin docker 图像连接到仅在 127.0.0.1 上监听的 HOST MySQL 服务器

c - Linux C : Accessing shared memory fails with `Invalid Argument` even though it was just created

c - 向数组添加异构成员

linux - 工作流 : Working with git and sandbox on linux

python - 将 IP 列表与另一个 IP 列表或 IP 范围进行比较