【问题标题】:error: ‘struct msghdr’ has no member named ‘msg_iov’错误:“struct msghdr”没有名为“msg_iov”的成员
【发布时间】:2019-08-07 07:11:50
【问题描述】:

我正在内核模块中编写 unix 套接字,当我尝试编译时,出现以下错误:

错误:“struct msghdr”没有名为“msg_iov”的成员

错误:“struct msghdr”没有名为“msg_iovlen”的成员

我尝试阅读 msghdr 的实现,但没有找到任何东西。

ret = kernel_recvmsg(sock, msg, vec, BUFFER_SIZE, BUFFER_SIZE, 0);

msg_iov = msg->msg_iov;
msg_iovlen = msg->msg_iovlen;

【问题讨论】:

  • 答案对您有帮助吗?还是有什么不清楚的地方?

标签: c sockets linux-kernel unix-socket


【解决方案1】:

您使用的 Linux 内核似乎 >= 3.19。由于3.19内核struct msghdr分为struct msghdrstruct user_msghdr

现在struct user_msghdr 包含msg_iovmsg_iovlen。但必须使用 struct iov_iter 代替 msg_iovmsg_iovlen

类似:

struct msghdr msg;
struct iovec iov;
iov.iov_base = buffer;
iov.iov_len  = length;

/* fill in msg */

#if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0)
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
#else
iov_iter_init(&msg.msg_iter, READ, &iov, 1, length);
#endif

/* ... */
/* call sock_recvmsg() or kernel_recvmsg() */

【讨论】:

  • 一种破坏工作代码的API,以及近40年历史的API。
  • 那么length是什么以及如何获得msg-&gt;msg_iovlenmsg-&gt;msg_iov?我正在尝试修复此脚本:superuser.com/a/1560259/464244
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 2010-09-17
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多