gpt4 book ai didi

c - struct msghdr 的 msg_name 不指向 linux 安全模块的 socket_recvmsg 中的 struct sockaddr_in

转载 作者:太空宇宙 更新时间:2023-11-04 10:49:39 24 4
gpt4 key购买 nike

我在 Linux 安全模块中使用安全操作“socket_recvmsg”。

int (*socket_recvmsg) (struct socket *sock,struct msghdr *msg, int size, int flags) 

Msg->msg_name 应该指向一个struct sockaddr_in,其中包含sin_family、源端口和源ip地址。 msg->msg_namelen表示msg->msg_name指向的数据大小。但是,我的socket_recvmsg函数中的msg->msg->namelen一直是112,远远大于sizeof(struct sockaddr_in)。所以我猜 msg->msg_name 必须指向其他一些数据结构,而不是 struct sockaddr_in。有谁知道 socket_recvmsg 中的 msg->msg_name 指向什么数据类型?

此外,我的 sendmsg 函数中的 msg->msg_name 始终等于 sizeof(struct sockaddr_in),并且我可以从 sendmsg 函数中的 msg->msg_name 获取端口和 ip 地址。

最佳答案

struct msghdrmsg_name 字段不一定必须指向struct sockaddr_in:它指向通用套接字地址;确切的结构取决于套接字系列:如果它是一个 AF_UNIX 套接字,它指向一个 struct sockaddr_un,如果它是 AF_INET,它指向struct sockaddr_in,如果是AF_INET6,则指向struct sockaddr_in6。它们都共享sa_family字段,这也是第一个字段,所以你可以将msg_name转换为struct sockaddr *,读取sa_family 字段,并决定从那里去哪里。

请记住,可能还实现了其他套接字系列;例如,Linux 有 AF_APPLETALKAF_X25,还有一些我现在不记得了。

Also, the msg->msg_name in my sendmsg function always equals to sizeof(struct sockaddr_in)

只要您使用 AF_INET 套接字,这就是事实,因为 IP 地址和端口号具有固定长度。但是 size 参数并不总是静态已知值。在 UNIX 套接字(本地套接字)中,您传递的大小不是 sizeof(struct sockaddr_un),而是 offsetof(struct sockaddr_un, sa_data)+strlen(pathname) ,其中 pathname 是套接字句柄所在的文件系统中路径字符串的大小。

关于c - struct msghdr 的 msg_name 不指向 linux 安全模块的 socket_recvmsg 中的 struct sockaddr_in,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31462455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com