在尝试 HttpClient 连接之前测试开放端口

Posted

技术标签:

【中文标题】在尝试 HttpClient 连接之前测试开放端口【英文标题】:Test for open port before attempting HttpClient connection 【发布时间】:2013-04-09 14:00:52 【问题描述】:

HttpClient 类的各种方法(GetAsync 等)采用 Uri 对象或字符串并尝试打开到指定位置的连接。但是,在我的情况下,远程主机很可能没有在监听(端口已关闭并将被主动拒绝;它在我们的 LAN 内)。

我宁愿不依赖捕获异常来处理这种情况,尤其是因为这些方法会抛出 AggregateException,然后我必须对其进行筛选。

有没有更好的方法来检测这种情况,同时还能获得 HttpClient 类的好处(远程主机是 WebApi 服务)?我是否应该使用 TcpClient 之类的东西预先检查端口是否正在侦听?当然,这涉及调用之间的竞争条件。我希望采用 HttpMessageHandler 的构造函数重载会有所帮助,但 WebRequestHandler 中的任何内容都不会向我跳出...

【问题讨论】:

【参考方案1】:

您可以使用Socket.Connect(string host, int port)

    private static bool TestForOpenHttpPort(string host)
    
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        
            s.Connect(host, 80);
            return true;
        
        catch (SocketException)
        
            return false;
        
        finally
        
            ((IDisposable)s).Dispose();
        
    

简单用法:

if (TestForOpenHttpPort("google.com"))

    // socket is open

【讨论】:

感谢您的回答,不幸的是,这仍然取决于捕获程序逻辑的异常,并且在我检查开放端口和尝试连接之间仍然存在竞争条件。我仍在寻找一种方法来挂钩实际的 HTTP 连接尝试并在那里捕获故障,但如果我找不到这样做的方法,我会接受这个答案......

以上是关于在尝试 HttpClient 连接之前测试开放端口的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient在响应流完全读取之前被释放,导致连接关闭异常

恕我直言,HttpClient 你不一定会用

渗透测试自学系列—常见端口扫描技术

CentOS ssh远程timeout错误

Jmeter 复用长连接 解决端口占用的问题

HackTheBox - Explore