.NET TcpClient Connect不会抛出异常

时间:2013-01-08 01:36:50

标签: c# .net

.Net的TcpClient允许我测试是否可以建立连接,所以,让我知道远程端口是否打开。

检查此代码:

TcpClient tcpCLient = new TcpClient();
        try
        {
            tcpCLient.Connect("www.google.com", 80);
            Console.WriteLine("Yes");
            Console.ReadLine();

        }
        catch (Exception)
        {

            Console.WriteLine("No");
            Console.ReadLine();
            throw;
        }

我测试了www.google.com的Tcp端口80,因为它已打开,我在控制台中看到“是”消息。 现在,我将尝试关闭www.google.com的TCP端口70。

 TcpClient tcpCLient = new TcpClient();
            try
            {
                tcpCLient.Connect("www.google.com", 70);
                Console.WriteLine("Yes");
                Console.ReadLine();

            }
            catch (Exception)
            {

                Console.WriteLine("No");
                Console.ReadLine();
                throw;
            }

我期待一个例外,所以我应该在控制台中看到“否”。为什么没有发生? 谢谢!!

更新: 几分钟后控制台就会保持这种状态。 enter image description here

2 个答案:

答案 0 :(得分:0)

简而言之:为什么一旦抓到它就会throw例外?

这可能是挂起控制台应用程序的原因,因为它正在等待超时。此外,如上所述,它可能是远程地址中的防火墙,因为它可能会丢弃您的呼叫。 如果你得到其他一些特殊的例外,请告诉我。

此外,希望您的代码处理套接字异常,因为它是客户端尝试连接时的常见异常。这是相关的帖子 - C# SocketException doesn't get caught

答案 1 :(得分:0)

@ pm100在一个文章中给我答案。

“原因几乎可以肯定是由于谷歌防火墙,他们丢弃了意外端口的数据包 - 这看起来像一个传输错误,所以你得到重试。尝试相同的测试到非防火墙的机器(例如localhost),它将失败立即因主机拒绝关闭端口的请求“

几分钟后你会看到“否”。