在 Linux 中使用 C 获取 inode 的远程 IP
Posted
技术标签:
【中文标题】在 Linux 中使用 C 获取 inode 的远程 IP【英文标题】:Get remote IP of inode using C in Linux 【发布时间】:2020-05-06 17:02:56 【问题描述】:例如我的/proc/net/tcp
包含:
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
2: 0900000A:91E4 0101B85D:0050 01 00000000:00000000 02:00000039 00000000 1000 0 75205 2 0000000000000000 26 4 30 10 -1
所以inode = 75205
,与IP93.184.1.1
通信。
如何在 C 中获取此 IP(远程地址)?
我知道我可以按空格分割并手动解析上面的内容,但这似乎是个坏主意,有没有更聪明的方法?
【问题讨论】:
【参考方案1】:不幸的是,没有其他方法可以从用户空间程序中获取此类信息。只有内核知道该信息,并且它提供该文件以使该信息可用于用户空间。
如果您 take a look at the source code 使用 ss
(又名“socketstat”)等工具,您会发现这些工具也可以查询 /proc/net/*
中的文件以获取有关打开套接字的信息。
【讨论】:
1) 为什么在这段代码中将256
硬编码为行大小?是每个 linux 的 const 吗? 2)每个套接字都可以从某个 ip 侦听和获取数据,那么我会在/proc/net/tcp
中看到什么?在远程地址行中?
@paramikoooo 1) 我不知道,请问ss
的程序员 2) 你是什么意思?每行都有以十六进制大端表示法编码的 IP,在您的示例中:0101B85D
-> 93.184.1.1
(0x5D = 93)
我的意思是我可以打开一个客户端套接字(例如 fd X),但是这个套接字可以从 IP 地址数中获取数据。我会在 /proc/net/tcp 中看到什么?我会看到几行具有相同的 Inode 吗?
@paramikoooo 您不能将多个 IP 连接到同一个套接字。当您侦听连接时,会为每个连接创建一个新套接字(因此 fd
)。以上是关于在 Linux 中使用 C 获取 inode 的远程 IP的主要内容,如果未能解决你的问题,请参考以下文章