0
有沒有辦法從struct sock
或其他任何方式獲得sockfd
,以便我可以唯一地標識我在內核空間中使用的套接字/連接?如何從內核空間獲取sockfd?
我需要在網絡適配器的設備驅動程序的上下文中的這條信息。
有沒有辦法從struct sock
或其他任何方式獲得sockfd
,以便我可以唯一地標識我在內核空間中使用的套接字/連接?如何從內核空間獲取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;
}
你當然會想檢查空指針,從struct sock *sk
在參數傳遞。
所以,基本上,這個想法是文件描述符(一個sockfd畢竟是一個常規文件描述符)的數值對應於其在進程打開文件表中的相應條目的索引。當指定struct sock *sk
指針時,我們必須執行的操作是在當前進程的打開文件表上循環,直到sk->sk_socket->file
指向的地址與表中的條目相匹配。
而這將如何唯一標識一個套接字/連接?它是哪種類型的連接?例如:TCP連接由(接口,源地址,源端口,目的地址,目標端口)元組唯一標識。 – ninjalj 2012-04-02 23:36:00
實際上,我並沒有自己建立連接,而是要求網卡執行此操作。 NIC正在返回對我的連接打開請求的確認,但本地端口將是NIC處理的端口,而不是主機堆棧處理的端口。我需要將鏈接到我的'sock'結構的文件句柄解複用傳入的數據包。 – Asblarf 2012-04-03 00:20:13