如何在Linux内核空间中从socket connect()获取本地源端口?

问题描述 投票:0回答:2

我正在操作 Linux 内核源代码(net/socket.c 文件)中的 connect() 函数,需要获取已建立连接的源端口和目标端口。该函数采用一个

struct sockaddr __user* uservaddr
参数,我已经可以通过将其转换为
struct sockaddr_in
来获取目标端口。但是本地源端口存储在哪里呢?该函数还声明了一个
struct socket* sock
,它可能包含我需要的数据,但我找不到任何带有源端口的变量。有什么帮助吗?

linux sockets kernel port
2个回答
1
投票
struct inet_sock *inet;
struct sock *sk = sock->sk;
inet = inet_sk(sk);
u16 post = ntohs(inet->inet_sport);

0
投票

简短回答:源端口和目标端口可以在 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 中使用,因此您不需要包含任何额外的头文件。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.