2012-04-02 88 views
0

有沒有辦法從struct sock或其他任何方式獲得sockfd,以便我可以唯一地標識我在內核空間中使用的套接字/連接?如何從內核空間獲取sockfd?

我需要在網絡適配器的設備驅動程序的上下文中的這條信息。

+0

而這將如何唯一標識一個套接字/連接?它是哪種類型的連接?例如:TCP連接由(接口,源地址,源端口,目的地址,目標端口)元組唯一標識。 – ninjalj 2012-04-02 23:36:00

+0

實際上,我並沒有自己建立連接,而是要求網卡執行此操作。 NIC正在返回對我的連接打開請求的確認,但本地端口將是NIC處理的端口,而不是主機堆棧處理的端口。我需要將鏈接到我的'sock'結構的文件句柄解複用傳入的數據包。 – Asblarf 2012-04-03 00:20:13

回答

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; 
} 

你當然會想檢查空指針,從struct sock *sk在參數傳遞。

所以,基本上,這個想法是文件描述符(一個sockfd畢竟是一個常規文件描述符)的數值對應於其在進程打開文件表中的相應條目的索引。當指定struct sock *sk指針時,我們必須執行的操作是在當前進程的打開文件表上循環,直到sk->sk_socket->file指向的地址與表中的條目相匹配。