.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;
}
我期待一个例外,所以我应该在控制台中看到“否”。为什么没有发生? 谢谢!!
更新: 几分钟后控制台就会保持这种状态。
答案 0 :(得分:0)
简而言之:为什么一旦抓到它就会throw
例外?
这可能是挂起控制台应用程序的原因,因为它正在等待超时。此外,如上所述,它可能是远程地址中的防火墙,因为它可能会丢弃您的呼叫。 如果你得到其他一些特殊的例外,请告诉我。
此外,希望您的代码处理套接字异常,因为它是客户端尝试连接时的常见异常。这是相关的帖子 - C# SocketException doesn't get caught
答案 1 :(得分:0)
@ pm100在一个文章中给我答案。
“原因几乎可以肯定是由于谷歌防火墙,他们丢弃了意外端口的数据包 - 这看起来像一个传输错误,所以你得到重试。尝试相同的测试到非防火墙的机器(例如localhost),它将失败立即因主机拒绝关闭端口的请求“
几分钟后你会看到“否”。