当前位置: 首页 > 知识库问答 >
问题:

如何找到哪个进程绑定了一个套接字但不侦听?

笪德华
2023-03-14

当我使用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);
    }
}
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;
}

它只显示侦听中的socks或从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可用于绑定。但不在/proc/net/tcp中导出。

共有1个答案

阎唯
2023-03-14

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

如何找到绑定套接字但不侦听或连接的进程:

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

请注意类型sock和名称Can't identify Protocol

这是怎么工作的?看看LSOF的常见问题:

为什么基于/proc的lsof报告某些套接字文件“无法识别协议”?

/Proc-based lsof可能报告:

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

这意味着它无法识别打开的套接字文件正在使用的协议(即AF_*指定)。Lsof通过将与/proc//fd条目相关联的节点号与/proc/net子目录的选定文件中找到的节点号匹配来标识协议。

...

您可能无法找到所需的节点号,因为并非所有内核协议模块都完全支持/proc/net信息。

验证过程

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/*

结果为空。

 类似资料:
  • 问题内容: 我正在使用slf4j登录我的应用程序。我得到slf4j的目的。我想知道如何找出当前绑定到哪个日志记录库slf4j。我的引用库中有log4j。我假设slf4j已将自身绑定到log4j。 我想知道的是,有什么方法可以明确确认这种绑定吗? 问题答案: 只需执行SLF4J的操作来发现绑定: 现在,你可以尝试找出什么是实际执行的logback在我的情况: 打印:

  • 我创建了一个新的Android项目,目标是API15,使用。自动生成的是: 将添加到它失败,因为。 所以我尝试创建另一个项目,这次以27级API为目标,得到了同样的结果,我得出的结论是我需要的API是28级(并放弃了,因为我不想以如此限制的内容为目标)。有人在评论另一个问题时指出,情况并非如此,因此这个问题是双重的。 > 在哪里可以找到一个特定类针对哪个API级别?WebViewAssetLoad

  • 问题内容: 我的应用程序在CentOS 5.5上运行。我正在使用原始套接字发送数据: 如何将此套接字绑定到特定的网络接口(例如eth1)? 问题答案: 第一行:设置变量 第二行:告诉程序绑定到哪个接口 第3-5行:获取接口名称的长度,并检查其大小是否太大。 六行:设置套接字的套接字选项,绑定到设备。 setsockopt原型: 此外,请确保您包括,和头文件

  • 问题内容: 当我在代码中指定要连接的IP时,我有一个小型的单边消息发送器,但是,我无法让套接字接受来自任何IP的连接。这是问题所在。 该是本地主机,如果我手动输入IP,例如,它的工作原理,但是,我怎么能离开它向所有人开放?还是我为此使用了错误的连接类型? 问题答案: 如果要绑定到所有可用的IPv4地址,请指定为IP地址。如果您在路由器后面,并且希望您的套接字可以通过Internet访问,而不是仅在

  • 我有一个用例,其中处理MS的单个kafka流将有一个处理器和一个消费者,消费者将使用处理器输出消息。类似于下面github中的示例 https://github.com/spring-cloud/spring-cloud-stream-samples/tree/master/kafka-streams-samples/kafka-streams-message-channel 在执行上面的示例时,

  • 问题内容: 我正在使用一个守护程序,该守护程序侦听UDP广播数据包,并通过UDP进行响应。当一个包进来,我想知道哪个IP地址(或NIC)的包来到 TO 这样我就可以与该IP地址作为源地址进行响应。(出于很多麻烦的原因,我们系统的某些用户希望将同一台计算机上的两个NIC连接到同一子网。我们告诉他们不要,但是他们坚持要这样做。我不需要提醒我这是多么的丑陋。 ) 似乎没有办法检查数据报并直接找出其目的地