如何找到 TCP 套接字的 inode?

Posted

技术标签:

【中文标题】如何找到 TCP 套接字的 inode?【英文标题】:How do I find the inode of a TCP socket? 【发布时间】:2015-02-23 21:40:54 【问题描述】:

如何将/proc/net/tcp 的“inode”列中的值与/proc/<pid>/fd/ 中的文件联系起来?

我的印象是 TCP 中的 inode 列具有套接字 inode 的十进制表示,但情况似乎并非如此。

例如,如果我运行telnet localhost 80,我会看到以下内容(telnet 是 pid 9021)。

/proc/net/tcp 包含

sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
23: 0100007F:CE2A 0100007F:0050 01 00000000:00000000 00:00000000 00000000  1000        0 361556 1 00000000 20 0 0 10 -1

这让我认为连接到 127.0.0.1:80 的套接字的 inode 是 361556。但是如果我运行 ls --inode -alh /proc/9021/fd,我会看到

349886 lrwx------ 1 me me 64 Dec 26 10:51 3 -> socket:[361556]

inode 为 349886,与 tcp 表的 inode 列中的值不同:361556。但链接目标似乎有正确的名称。同样,stat /proc/9021/3 显示:

File: ‘/proc/9021/fd/3’ -> ‘socket:[361556]’
Size: 64            Blocks: 0          IO Block: 1024   symbolic link
Device: 3h/3d   Inode: 349886      Links: 1

tcp 表的inode 列的数字是多少?为什么它不与lsstat 报告的inode 对齐?

(如果这很重要,我正在运行 Ubuntu 14.10)

【问题讨论】:

【参考方案1】:

lsstat 显示的inode 用于指向与套接字关联的inode 的符号链接。运行 ls -iLalh 显示正确的 inode。 stat -L 同上。

Herpa derp derp。我只是在撰写问题时才知道这一点。 ;_;

【讨论】:

【参考方案2】:

inode id 表示每个 fs 挂载的文件 id(proc、sys、ntfs、ext...),因此您可能理解在这里处理两个不同的 fs:procfs 和一些伪套接字 fs。

/proc/pid/fd/ 目录下的文件是软链接,在 procfs fs 中有 inode 表示。 这些链接“指向”不同的“fs”——socket fs。

stat -Lls -iLalh 所做的是为您提供链接指向的文件的 inode。 您也可以使用readlink /proc/#pid/fd/#fdnum 显式执行此操作

【讨论】:

以上是关于如何找到 TCP 套接字的 inode?的主要内容,如果未能解决你的问题,请参考以下文章

TCP套接字服务器如何判断从客户端接收到的数据何时完成?

如何在 VB.NET 中检查 TCP 服务器(套接字)与 TCP 客户端的连接状态

在创建管道,fifo或套接字时创建inode

如何找到linux的套接字缓冲区大小

Linux文件系统与硬盘存储(分区格式化挂载inode软链接与硬链接)

如何使用“C”在 Windows 中找到空闲的 TCP 端口