gpt4 book ai didi

linux - 如何找到哪个进程绑定(bind)了一个套接字但没有监听?

转载 作者:IT王子 更新时间:2023-10-29 00:57:22 25 4
gpt4 key购买 nike

当我用nc监听一个端口时,它显示

nc -l -vv -p 21000

retrying local 0.0.0.0:21000 : Address already in use Can't grab 0.0.0.0:21000 with bind

但是我用工具netstat/ss 找不到哪个任务占用了这个端口

netstat -an|grep 21000 

;没有找到

ss -a|grep 21000 

;没有找到

这个端口被我的java程序占用了,代码是:

public class Test1 {

public static void main(String[] args) throws InterruptedException {
Socket s = new Socket();
try {
s.bind(new InetSocketAddress("127.0.0.1",21000));
} catch (IOException e) {
e.printStackTrace();

}
Thread.sleep(500000000000L);
}
}

当我绑定(bind)套接字时,但不将其与连接或监听一起使用。我进入/proc/[java task id]/fd ,发现这个 socket 的 inode 是“socket:[3073501]”但我什至在/proc/net/tcp 或/proc/net/tcp6 中也找不到 inode 或端口

有什么方法可以找到绑定(bind)套接字但不监听或连接的进程。

谢谢。

我看到了 linux 3.10.0-327 的源代码。我认为文件/proc/net/tcp 的内容来自net/ipv4/tcp_ipv4.c。

在 tcp_proc_register 方法中,

static void *tcp_get_idx(struct seq_file *seq, loff_t pos)      
{
void *rc;
struct tcp_iter_state *st = seq->private;

st->state = TCP_SEQ_STATE_LISTENING;
rc = listening_get_idx(seq, &pos);

if (!rc) {
st->state = TCP_SEQ_STATE_ESTABLISHED;
rc = established_get_idx(seq, pos);
}

return rc;
}

它只显示正在监听或从 tcp_hashinfo 建立的 socks 。但是 tcp_hashinfo 有三个结构

struct inet_bind_hashbucket     *bhash; 
struct inet_listen_hashbucket listening_hash[INET_LHTABLE_SIZE];
struct inet_ehash_bucket *ehash;

bhash 可用于绑定(bind)。但是不在/proc/net/tcp 中导出。

最佳答案

我在 Ubuntu 下测试了你的 Java 程序。

如何找到绑定(bind)套接字但不监听或连接的进程:

lsof

lsof | grep "can't identify protocol"

你会得到这样的结果:

COMMAND     PID   TID       USER   FD      TYPE             DEVICE SIZE/OFF    NODE NAME
java 29644 29653 stephan 12u sock 0,7 0t0 312066 can't identify protocol

请注意 TYPE sock 和 NAME 无法识别协议(protocol)

这是如何运作的?查看 lsof 的常见问题解答:

Why does /proc-based lsof report "can't identify protocol" for some socket files?

/proc-based lsof may report:

  COMMAND PID ... TYPE ... NODE NAME
pump 226 ... sock ... 309 can't identify protocol

This means that it can't identify the protocol (i.e., the AF_* designation) being used by the open socket file. Lsof identifies protocols by matching the node number associated with the /proc//fd entry to the node numbers found in selected files of the /proc/net sub-directory.

...

You may not be able to find the desired node number, because not all kernel protocol modules fully support /proc/net information.

验证过程

lsof 输出中的 PID 是 29644。

ls -l /proc/29644/fd   

结果是:

...
lrwx------ 1 stephan stephan 64 Jul 7 22:52 11 -> socket:[312064]
lrwx------ 1 stephan stephan 64 Jul 7 22:52 12 -> socket:[312066]
...

grep 312066 /proc/net/*

给出一个空的结果。

关于linux - 如何找到哪个进程绑定(bind)了一个套接字但没有监听?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50849122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com