【问题标题】:How to get local source port from socket connect() in Linux Kernel Space?如何从 Linux 内核空间中的 socket connect() 获取本地源端口?
【发布时间】:2018-04-16 04:07:11
【问题描述】:

我在 Linux 内核源代码(net/socket.c 文件)中操作 connect() 函数,需要获取已建立连接的源端口和目标端口。该函数采用struct sockaddr __user* uservaddr 参数,通过将其转换为struct sockaddr_in,我已经可以从中获取目标端口。但是本地源端口存储在哪里?该函数还声明了一个struct socket* sock,它可能包含我需要的数据,但我找不到源端口的任何变量。有什么帮助吗?

【问题讨论】:

    标签: linux sockets kernel connect ports


    【解决方案1】:
    struct inet_sock *inet;
    struct sock *sk = sock->sk;
    inet = inet_sk(sk);
    u16 post = ntohs(inet->inet_sport);
    

    【讨论】:

      【解决方案2】:

      简答:源端口和目的端口可以在 struct inet_sock 中找到。您可以使用以下方式从连接访问它:

      inet = inet_sk(sock->sock)
      

      更多详情: 套接字上允许的操作在 struct proto_ops 中定义。按照 TCP 的 connect() 函数的实现(在 net/ipv4/tcp_ipv4.c 中),你可以看到它是由 tcp_v4_connect() 实现的:

      int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
      {
              struct sockaddr_in *usin = (struct sockaddr_in *)uaddr;
              struct inet_sock *inet = inet_sk(sk);
      

      及以后:

      struct proto tcp_prot = {
              ...
              .connect                = tcp_v4_connect,
      

      inet->inet_sport 和inet->inet_dport 用于在上述函数中设置/获取源端口和目标端口。

      快速浏览一下,我可以看到 inet_sock 已在 socket.c 中使用,因此您无需包含任何额外的头文件。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2012-10-09
        • 1970-01-01
        • 2016-01-21
        • 2014-04-27
        • 1970-01-01
        • 2014-05-24
        • 1970-01-01
        • 2017-11-24
        • 1970-01-01
        相关资源
        最近更新 更多