gpt4 book ai didi

c - 如何从内核空间获取sockfd?

转载 作者:行者123 更新时间:2023-11-30 14:25:46 25 4
gpt4 key购买 nike

有没有办法从 struct sock 获取 sockfd 或任何其他方式让我能够唯一标识我正在使用的套接字/连接内核空间?

我需要在网络适配器的设备驱动程序上下文中获取此信息。

最佳答案

我认为这是不可能的,但实际上有一种方法,至少对于单个套接字没有重复文件描述符的简单情况而言。我正在回答我自己的问题,希望它能帮助那里的人。

int get_sockfd(struct sock *sk)
{
int sockfd;
unsigned int i;
struct files_struct *current_files;
struct fdtable *files;
struct socket *sock;
struct file *sock_filp;

sockfd = -1;

sock = sk->sk_socket;
sock_filp = sock->file;

current_files = current->files;
files = files_fdtable(current_files);

for (i = 0; files->fd[i] != NULL; i++) {
if (sock_filp == files->fd[i]) {
sockfd = i;
break;
}
}

return sockfd;
}

您当然希望检查 NULL 指针,从参数中传递的 struct sock *sk 开始。

所以,基本上,这个想法是文件描述符的数值(毕竟 sockfd 只是一个常规文件描述符)对应于进程打开文件表中相应条目的索引。当给定 struct sock *sk 指针时,我们要做的就是循环当前进程的打开文件表,直到 sk->sk_socket->file 指向的地址为止> 匹配表中的条目。

关于c - 如何从内核空间获取sockfd?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9982333/

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