【问题标题】:Getting socket ID of socket in sk_buff在 sk_buff 中获取套接字的套接字 ID
【发布时间】:2016-12-13 15:12:41
【问题描述】:

是否有可能在sk_buff struct 的linux 内核中获得套接字ID? 我知道我可以使用此代码获得socket

const struct tcphdr *th = tcp_hdr(skb);
struct sock *sk = __inet_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest);
if (sk)
    struct socket* = sk->sk_socket;

我在哪里可以找到 ID 以及这个 ID 的最大值是多少?

【问题讨论】:

    标签: linux sockets kernel


    【解决方案1】:

    套接字是一个文件。

    您会在struct socket 中找到struct file *file 成员。

    我建议您look at this question,特别是接受答案上的链接"things you never should do in the Kernel",因为我担心您尝试从内核中的套接字结构中检索文件描述符的原因(通常,你想做完全相反的事情)。

    要从内核下的给定文件中检索文件描述符,您需要迭代fdtable(搜索files_fdtable())...这是一项巨大的工作,特别是如果有大量打开的文件。

    文件描述符值的最大值将是系统中允许的最大文件数,可以通过以下方式检索:

    files_fdtable(current->files)->max_fds;
    

    【讨论】:

    • 您好,感谢您的回答。我需要一些连接 ID 之王,因为我需要为每个连接创建带有指向我的数据的指针的静态数组。当我处于用户模式(挂钩sendwrite 等)时,我创建了大小为array[65536] 的静态数组,因为套接字描述符为short,当我需要从该数组中获取数据时,例如在@987654332 @ 函数我使用了 array[fd] - 它非常快速和安全,现在我正在为我的内核 netfilter 模块寻找替代方案
    • 请注意,socket() 返回一个int(不是short),在没有有效检查其大小的情况下,您不应对其大小做出假设。在我写此评论的系统上,int 是 32 位长,这意味着您的数组应该被声明为 int array[2147483648],显然会导致堆栈溢出,因为您将尝试在堆。我的意思是,你可能想改变你的方法。我建议您查看net/netfilter/ 目录中的 netfilter 模块代码,并检查它们如何处理像您这样的情况。
    • 嗨,我发现了一件事,它是sk_buff->sock->sk_user_data,我可以在这里粘贴指向我的数据的指针,但是在服务器端(我加载我的驱动程序)每个客户端连接都存在问题到一个服务器端口,sk_buff->sock 对于每个客户端连接都是相同的,也许你知道我在哪里可以找到每个连接的 custom data,我可以在哪里粘贴指向我的数据的指针?
    • 我认为您是在谈论listen() 的绑定 SOCK_STREAM 套接字,而不是为 accept() 安装的套接字,它特定于特定 [client] 流。
    • 是的,在服务器端(我加载我的内核模块的地方)服务器套接字使用accept,并且所有到达此端口的sk_buff 具有相同的sk_buff->sock->sk_user_data,对于每个连接到此港口。你知道我可以在内核中的哪个位置存储每个 tcp 连接的私有数据吗?
    猜你喜欢
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    相关资源
    最近更新 更多