【问题标题】:How can I find an unused port?如何找到未使用的端口?
【发布时间】:2011-03-26 10:53:39
【问题描述】:

我需要创建一个脑死 HTTP 服务器,它为 localhost 上的所有内容返回 404。具体来说,我在验收测试工具下有一个程序调用服务器,但为了测试,我想通过跳过不相关的检查来节省时间。

我有一种方法可以传入程序用作测试工具一部分的 URL,而测试工具(当前)只是在端口 80 上创建这样一个服务器。

但是,如果多个测试尝试同时运行,则会出现问题,因为每个测试工具都尝试在端口 80 上创建一个 HTTP 服务器,但其中一个工具会失败。

因此,我想随机化端口并确保它在尝试创建 HTTP 服务器之前可用。如何检查该端口是否正在使用?

【问题讨论】:

    标签: .net port-number


    【解决方案1】:

    为什么不完全模拟请求,这样您实际上根本不需要服务器或网络连接?

    这将使测试变得不那么脆弱。

    好吧,无论如何,您能不能只在某个预定义范围内生成一个随机端口,然后尝试在其上设置一个服务器?如果已经被占用,应该抛出异常。

    【讨论】:

    • 这是一个验收测试。测试根本无法访问被测应用程序的内部结构。它使用命令行参数运行被测应用程序并检查结果。这并不是一个真正脆弱的问题,因为被测应用程序并不关心来自服务器的响应是什么——它只是发送数据。并且将其发送到真正的远程服务器会增加每次测试 5 秒以上的时间,当有数百个测试时,这很烦人。
    【解决方案2】:

    我认为答案很明显:如果套接字侦听失败,则它不可用:选择另一个。只听例外情况。

    【讨论】:

      【解决方案3】:
      Socket.Select()
      

      IIRC

      【讨论】:

        【解决方案4】:

        将套接字绑定到端口 0,系统会选择一个可用端口,我相信在 1024 和 5000 之间

        稍后您可以使用Socket.LocalEndPoint 属性了解分配的端口。

        【讨论】:

        • 我不知道,从来不需要它,但真的很高兴知道:) +1
        • +1 -- 这可能是最好的答案,但不幸的是,我使用的 HTTP 库是垃圾,并没有公开套接字供我检查。
        • 我基本上同意并认为所有配置了硬编码端口的服务器软件都是偶然运行的。请参阅:post.ly/1bxVA 我编写了一个返回端口号的服务器。另一种选择可能是单独创建套接字并将其传递给服务器。
        猜你喜欢
        • 1970-01-01
        • 2013-03-25
        • 2011-02-10
        • 2018-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多