如何从内核空间获取sockfd?

时间:2012-04-02 19:07:56

标签: c network-programming linux-kernel

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

我需要在网络适配器的设备驱动程序的上下文中提供这条信息。

1 个答案:

答案 0 :(得分:2)

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

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指针,从param中传递的struct sock *sk开始。

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