在 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的主要内容,如果未能解决你的问题,请参考以下文章

Linux C ext2fs_write_inode_full 无法写入

Linux下关于inode的操作

请问linux系统中inode和block的关系?

LINUX系统中,软/硬链接和inode的一些关系。

Linux inode耗尽故障处理

linux——文件连接