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

无法侦听特定的Windows 10端口

堵鸿光
2023-03-14

我发现我的Windows 10机器上有许多端口(1)未被任何进程使用,(2)我无法侦听。

我在尝试运行使用端口3000的节点服务器时发现了这个问题。我发现了一些关于这个主题的问题。这一个是典型的:节点。js端口3000已经在使用,但实际上没有?

这个问题和类似问题的所有受访者都建议使用“netstat -ano”来查找使用端口并杀死它的进程。

我发现有大量端口被阻塞,而这些端口与进程无关。这与AV或防火墙无关。我关闭了防火墙,只有Windows Defender AV。

我编写了一个程序,在127.0.0.1上侦听3000到5000之间(包括3000和5000)的端口。

        int port = 3000;
        while(port <= 5001)
        {
            try
            {
                ListenOnPort(port);
                ++port;

            }
            catch (Exception ex)
            {
                Console.WriteLine($"Listen on {port} failed: {ex.Message}");
                ++port;
            }
        }

ListenPort所在位置。。。

    private static void ListenOnPort(int v)
    {
        var uri = new UriBuilder("http", "127.0.0.1", v);
        HttpListener listener = new HttpListener();
        listener.Prefixes.Add(uri.Uri.ToString());
        Console.WriteLine($"Listening on {v}");
        listener.TimeoutManager.IdleConnection = new TimeSpan(0, 0, 1);
        listener.Start();
        var task = listener.GetContextAsync();
        if(task.Wait(new TimeSpan(0,0,1)))
        {
            HttpListenerResponse response = task.Result.Response;
            // Construct a response.
            string responseString = "<HTML><BODY> Hello world!</BODY></HTML>";
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
            // Get a response stream and write the response to it.
            response.ContentLength64 = buffer.Length;
            System.IO.Stream output = response.OutputStream;
            output.Write(buffer, 0, buffer.Length);
            // You must close the output stream.
            output.Close();
        }
        listener.Stop();
    }

该程序产生的输出与此类似。。。

Listening on 3000
Listen on 3000 failed: The process cannot access the file because it is being used by another process
Listening on 3001
Listen on 3001 failed: The process cannot access the file because it is being used by another process
Listening on 3002
Listen on 3002 failed: The process cannot access the file because it is being used by another process
Listening on 3003
Listen on 3003 failed: The process cannot access the file because it is being used by another     process
Listening on 3004
Listen on 3004 failed: The process cannot access the file because it is being used by another process
Listening on 3005
Listen on 3005 failed: The process cannot access the file because it is being used by another process
Listening on 3006
Listening on 3007
Listening on 3008
Listening on 3009
Listening on 3010

我发现在3000到5000之间,有624个端口被阻止。同时“netstat-ano”显示该范围内正好有5个端口在使用。那么是什么阻止了619个其他端口呢?

共有2个答案

师增
2023-03-14

我们设法在您无法更改端口号的情况下(如不可html" target="_blank">配置的应用程序)包含此问题。

发出命令时:

netsh int ip show excludedportrange protocol=tcp

您会得到一个带有保留端口范围列表的输出:

Protocol tcp Port Exclusion Ranges

Start Port    End Port
----------    --------
     33474       33573
     50000       50059     *
     58159       58258
     58259       58358
     58359       58458
     58459       58558
     58559       58658
     58659       58758
     58759       58858

* - Administered port exclusions.

最有可能的原因是Windows Hyper-V(微软的硬件虚拟化产品)保留随机端口范围(通常是100个端口的块)。这变得很痛苦,因为如果你正在开发一个使用多个端口的应用程序或更大的解决方案,有时你会遇到冲突,有时在重新启动系统后不会。

要找到“动态端口范围”,您可以发出以下命令:

netsh int ipv4 show dynamicport tcp

答案是:

Protocol tcp Dynamic Port Range
---------------------------------
Start Port      : 1024
Number of Ports : 64511

您可以指示Windows在冲突区域之外修改此范围。假设您的开发低于或高于端口60000,您可以发出以下命令将动态端口范围限制在其中(您必须具有管理员权限):

netsh int ipv4 set dynamic tcp start=60001 num=5534

要使Hyper-V(以及一般Windows)使用此新的动态范围,您必须重新启动系统。

现在,如果我们请求排除的端口范围:

netsh int ip show excludedportrange protocol=tcp

回应变了:

Protocol tcp Port Exclusion Ranges

Start Port    End Port
----------    --------
     50000       50059     *
     63904       64003
     64004       64103
     64105       64204
     64205       64304
     64305       64404
     64405       64504
     64505       64604
     64605       64704

* - Administered port exclusions.

只有“管理的端口排除”保留在端口60001下

宦砚
2023-03-14

对吧...

在寻找其他东西时,我找到了答案(至少是问题的根源)。我无法连接到这些端口的原因是,它们都是windows上排除的端口范围的一部分。要查看排除的端口,请使用。。。

$ netsh int ipv4 show excludedportrange tcp

神奇的是,这里有一个我无法连接的所有端口的列表。这些被排除的端口范围显然来自HyperV和Docker,我已经安装了这两个端口。显然有一种方法可以把港口夺回来...不容易,因为它涉及卸载Docker和HyperV,然后为自己保留端口范围,然后重新安装HyperV和Docker。不值得。现在我简单地知道了如何找到我不能使用的端口,我将简单地不使用它们!

 类似资料:
  • 我刚接触docker,想要在守护进程模式下启动它,监听特定的IP地址和端口。文档中说,这可以通过编写来实现。然后它说我可以用这个命令列出正在运行的容器。如果我这样做,我会得到以下信息: 获取http:///var/run/docker.sock/v1.20/containers/json?all=1:拨号unix/var/run/docker.sock:没有这样的文件或目录。 是否尝试连接到启用T

  • 当我试着运行appium时,突然遇到了这个错误。 错误:处理命令时发生未知的服务器端错误。原始错误:执行adbExec时出错。原始错误:“Command”C:\Users\vsingh\AppData\Local\Android\Sdk\platform tools\adb。exe-P 5037-s emulator-5554转发tcp:8200 tcp:6790'已退出,代码为1';斯特德:亚行

  • 当我尝试通过局域网ping minecraft服务器时,文档会说: 我试图通过以下方式在python中实现这一点 这给了我一个 请帮助:(我不知道我的代码出了什么问题。 顺便说一句,发送数据包到那个端口是有效的,而假冒的服务器会出现在minecraft应用程序上。

  • 我可以在下面的代码中为添加事件侦听器,但不能添加到。 是不是因为twitter做了一些事情不让我这么做?有办法绕过它吗?

  • 我正在尝试使用 https://github.com/jeroenransijn/expressful/blob/master/docs/total-beginner-guide.md 的步骤运行一个简单的表达应用程序 当我在正确的路径中执行“node app.js”时,我在端口3000上启动了console.log Express服务器(Expressful服务器在端口3000上侦听)。虽然ex

  • 我已经用重新启动了influxdb,但是没有任何帮助。 我错过了什么? 更新7.11.2016 21:59 更新13.4.2020问题已修复。 这是一个老问题,我不记得我到底是如何解决这个问题的,但我做到了。如果我没记错的话,问题是流入没有加载正确的配置文件,这是我自己当时的愚蠢。可悲的是,我不记得为什么会发生这种事,但我记得这是我自己做的。记住总是正确地阅读文档,并谷歌出它的sht。