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

时间:2017-11-03 12:13:06

标签: linux sockets kernel connect ports

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

2 个答案:

答案 0 :(得分:0)

简短回答:可以在struct inet_sock中找到source和dest端口。您可以使用以下方式从connect访问它:

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中使用,因此您不需要包含任何其他头文件。

希望这有帮助。

答案 1 :(得分:0)

struct inet_sock *inet;
struct sock *sk = sock->sk;
inet = inet_sk(sk);
u16 post = ntohs(inet->inet_sport);