【问题标题】:Get remote IP of inode using C in Linux在 Linux 中使用 C 获取 inode 的远程 IP
【发布时间】: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(远程地址)?

我知道我可以按空格分割并手动解析上面的内容,但这似乎是个坏主意,有没有更聪明的方法?

【问题讨论】:

    标签: c linux sockets tcp inode


    【解决方案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)。
    猜你喜欢
    • 2017-10-10
    • 2015-06-28
    • 2020-03-25
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 2010-10-10
    相关资源
    最近更新 更多