- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在用户空间,我使用 sock_raw
(包括 IP header )封装了一个 L3 数据包,并使用 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
?
最佳答案
struct msghdr
的msg_name
和msg_namelen
字段与dest_addr
和的功能相同
个参数: 它们指定目标地址。它们旨在与正常 未连接的数据报套接字一起使用。例如,当在 sendto
的 addrlenAF_INET
/SOCK_DGRAM
套接字上使用 sendmsg
发送 UDP 数据包时,您仅在 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/
没有实际原因,只是想知道。为什么在 Linux 中的 msghdr 结构中,他们将 size_t 类型用于 msg_iovlen 字段?我发现它有点令人困惑,因为 size_t 通常表示“多少字节”。
我目前正在为一个学校项目开发一个 linux 内核模块,该模块涉及将内核哈希表实现公开给用户空间。 为此,我还创建了一个用户空间 API,它通过 Netlink 套接字与 LKM 通信。 我现在确实让
我在 recvmmsg() 返回后打印出 msghdr.msg_namelen 但它没有设置。 但是,msg_len 设置正确。 我正在监听多播流量(即数据报)。 为了让 recvmmsg() 填充
我正在尝试使用 sock_sendmsg() 从驱动程序发送 UDP 数据包。 关于如何使用 sock_sendmsg() 和 msghdr 填充 UDP 数据包并传输它有几个指南,但它们都是针对旧内
在用户空间,我使用 sock_raw(包括 IP header )封装了一个 L3 数据包,并使用 sock_sendmsg() 和 msghdr 发送到内核空间>结构 struct msghdr {
我正在内核模块中编写unix套接字,当我尝试编译时,出现以下错误: error: ‘struct msghdr’ has no member named ‘msg_iov’ error: ‘struc
我试图理解 sys/socket.h 的 msghdr 结构的以下成员图书馆。 struct iovec *msg_iov 分散/聚集数组 void *msg_control 辅助数据,见下文 内容如
我正在尝试使用 sendmsg 和 recvmsg 函数(C 语言)通过 unix 域套接字发送和接收消息。 过程很简单: 服务器使用sendmsg向客户端发送一个字符串(必须使用struct msg
我在 Linux 安全模块中使用安全操作“socket_recvmsg”。 int (*socket_recvmsg) (struct socket *sock,struct msghdr *msg,
我是一名优秀的程序员,十分优秀!