- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 sock_sendmsg() 从驱动程序发送 UDP 数据包。
关于如何使用 sock_sendmsg() 和 msghdr 填充 UDP 数据包并传输它有几个指南,但它们都是针对旧内核版本的。在 3.13 和 4.8 之间的某个时间,struct msghdr 更改为:
struct msghdr {
void * msg_name; /* Socket name */
int msg_namelen; /* Length of name */
struct iovec * msg_iov; /* Data blocks */
__kernel_size_t msg_iovlen; /* Number of blocks */
void * msg_control; /* Per protocol magic (eg BSD file descriptor passing) */
__kernel_size_t msg_controllen; /* Length of cmsg list */
unsigned int msg_flags;
};
收件人:
struct msghdr {
void *msg_name; /* ptr to socket address structure */
int msg_namelen; /* size of socket address structure */
struct iov_iter msg_iter; /* data */
void *msg_control; /* ancillary data */
__kernel_size_t msg_controllen; /* ancillary data buffer length */
unsigned int msg_flags; /* flags on received message */
struct kiocb *msg_iocb; /* ptr to iocb for async requests */
};
不是将 msg_iov 设置为指向带有数据的 iovec:
struct msghdr msg = {};
struct iovec iov = {};
iov.iov_base = data;
iov.iov_len = dataLen;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
现在有一个 iov_iter 结构:
struct iov_iter {
int type;
size_t iov_offset;
size_t count;
union {
const struct iovec *iov;
const struct kvec *kvec;
const struct bio_vec *bvec;
struct pipe_inode_info *pipe;
};
union {
unsigned long nr_segs;
struct {
int idx;
int start_idx;
};
};
};
如何用数据填充 msghdr 中的 iov_iter 结构,以便将其传递给 sock_sendmsg?
最佳答案
在尝试并阅读 Ctx ( lwn.net/Articles/625077 ) 发布的指南后,我明白了。
unsigned long nr_segments = 1;
size_t count = 1;
struct msghdr msg = {};
struct iovec iov = {};
iov.iov_base = data;
iov.iov_len = dataLen;
iov_iter_init(&msg.msg_iter, READ, &iov, nr_segments, count);
关于c - 如何填写用于 msghdr 的 iov_iter 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47315064/
没有实际原因,只是想知道。为什么在 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,
我是一名优秀的程序员,十分优秀!