Sockets 从'导出套接字fd;结构sock';

Sockets 从'导出套接字fd;结构sock';,sockets,networking,linux-kernel,system-calls,Sockets,Networking,Linux Kernel,System Calls,有没有办法从内核中的struct sock类型的对象获取套接字fd?快速查看struct sock的内部内容无助于找到类似于套接字描述符的内容。基本上我需要socket()syscall返回的内容,它不是存储在'sock'中吗 我需要在数据包到达IP堆栈之前获取fd 谢谢。对于每个进程,都有一个文件描述符的表,它将文件描述符映射到结构文件对象。您可以使用iterate\u fd()函数迭代此表 对于任何struct文件,您可以使用sock\u from_file()函数确定它对应的struct

有没有办法从内核中的
struct sock
类型的对象获取套接字fd?快速查看
struct sock
的内部内容无助于找到类似于套接字描述符的内容。基本上我需要
socket()
syscall返回的内容,它不是存储在'sock'中吗

我需要在数据包到达IP堆栈之前获取
fd


谢谢。

对于每个进程,都有一个文件描述符的,它将文件描述符映射到
结构文件
对象。您可以使用
iterate\u fd()
函数迭代此表

对于任何
struct文件
,您可以使用
sock\u from_file()
函数确定它对应的
struct sock
对象

总计:

/*
 * Callback for iterate_fd().
 *
 * If given file corresponds to the given socket, return fd + 1.
 * Otherwise return 0.
 *
 * Note, that returning 0 is needed for continue the search.
 */
static int check_file_is_sock(void* s, struct file* f, int fd)
{
    int err;
    struct sock* real_sock = sock_from_file(f, &err);
    if(real_sock == s)
        return fd + 1;
    else
        return 0;
}
// Return file descriptor for given socket in given process.
int get_fd_for_sock(struct sock* s, struct task* p)
{
    int search_res;
    task_lock(p);
    // This returns either (fd + 1) or 0 if not found.
    search_res = iterate_fd(p->files, 0, &check_file_is_sock, s);
    task_unlock(p);

    if(search_res)
        return search_res - 1;
    else
        return -1; // Not found
}

fd编号仅基于每个进程,因此不清楚在内核中请求fd时需要什么。@Martin,谢谢您的评论。基本上,当我有'struct sock'对象时,我希望能够知道它对应于用户空间中的哪个
fd
。我的意思是,您可能需要从其他方面开始。取一个特定进程的文件描述符表,遍历它,检查是否有一些记录指向有问题的套接字。一个或多个用户空间任务中的多个FD可以引用同一个套接字。(很抱歉,刚才没有详细的回答,因为我需要检查一些细节,现在没有时间,如果没有人能更快地回答,也许以后会有时间。)注意,完全可能没有进程打开了套接字,不止一个进程打开了套接字,甚至是同一个套接字多次打开的进程。@Tsyvarev,谢谢你的回答。您所建议的代码只在流程上下文中工作,这是对的吗?否则,我如何获得“task\u struct”指针?我需要在数据包到达IP堆栈之前获取
fd
。这不需要是进程上下文。您可以在前一点存储
task\u struct
,并在此处使用它。或者为find one迭代所有任务,其中包含给定的
sock
对象。在任何情况下,您都需要
task\u struct
对象,因为没有它,文件描述符就没有意义。这一点在对您的问题和我的回答的评论中已明确说明。@Tsyvarev,在
\u netif\u receive\u skb\u core()->schu handle\u ingres()
代码路径中,我在哪里可以获得对
任务结构的引用?此时只有
skb
可用,有可能通过
skb->sk
访问
文件