2013-01-08 162 views
-1

.Net的TcpClient允许我测试是否可以建立连接,因此,让我知道远程端口是否打开。.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

+0

你可以扩展'没有任何反应'。你有没有收到任何消息。您等了多久,可能会有超时和重试问题 – pm100

+0

@ Pm100完成。谢谢。 –

+1

我看到同样的东西 - 你得等几分钟。原因几乎肯定是由于谷歌防火墙,他们丢包意外的端口 - 这看起来像一个传输错误,所以你会得到重试。尝试对非防火墙机器(例如本地主机)进行相同的测试,它会立即失败,因为主机拒绝关闭端口 – pm100

回答

0

@ pm100给我一个commments的答案。

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

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

0

简而言之:为什么你throw例外,一旦你抓住了吗?

这可能是挂起控制台应用程序的原因,因为它正在等待超时。另外,如上所述,它可能是远程地址中的防火墙,因为它可能会丢掉你的呼叫。 如果您还有其他特定的例外情况,请告诉我。

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

+0

谢谢。我不认为这个问题是因为抛出,你看到了相同的行为。 –

+0

的确,我在我的回答中也提到过。 –