有没有办法从sockfd
或任何其他方式获取struct sock
,以便我能够唯一地识别我在内核空间中使用的套接字/连接?
我需要在网络适配器的设备驱动程序的上下文中提供这条信息。
答案 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
指向的地址匹配表中的条目。