【问题标题】:How to check if a server is listening without exception handling如何检查服务器是否正在侦听而不进行异常处理
【发布时间】:2011-05-14 10:31:30
【问题描述】:

我正在开发两个使用 TCP 相互连接的应用程序。在某一时刻,其中一个正在尝试使用 TcpClient 进行连接,但不能保证另一个应用已经开始侦听(使用 TcpListener)。

我的第一次尝试是这样的:

TcpClient c = null;
while (true)
{
    try
    {
        c = new TcpClient();
        c.NoDelay = true;
        c.Connect( ip, port );
        break;
    }
    catch (SocketException ex)
    {
        Console.WriteLine(string.Format("Could not connect to {0}:{1}, retrying...", ip, port));
        Thread.Sleep( 500 );
    }
}

但是,问题在于它依赖于异常处理,这对我来说有点麻烦,因为我设置了 VS 来捕获任何抛出的异常(“调试 -> 异常...”菜单)。所以每次它尝试连接时,它都会闯入VS,我必须按继续。

我得到的例外是:

无法建立连接,因为目标机器主动拒绝它 127.0.0.1:50000

我想有一种方法可以检查服务器是否正在侦听特定端口,而无需实际尝试连接到该端口。我知道仅仅检查是不够的 - 服务器可能会在检查和连接尝试之间发生故障,但在我开发它时它对我来说仍然会好得多。

或者是这样的:

TcpClient tcpClient = new TcpClient();
while ( !tcpClient.TryConnect(....) )
{ Thread.Sleep(1000); }

与此类似:

if (bool.TryParse( "false" ))
{ ... }

我还尝试使用异步方法(开始/结束连接)并手动设置 ManualResetEvent 的超时,但这也不起作用。我已经搜索了互联网,但我一直无法找到解决这个问题的方法,这就是我最终在这里发帖的原因:)

【问题讨论】:

    标签: c# exception-handling network-programming tcpclient


    【解决方案1】:

    问题是 VS 打破了异常?您总是可以让 VS 忽略特定的异常系列。

    在 VS 中,在调试菜单中,选择“异常...”,然后在显示的对话框中您可以控制它。

    【讨论】:

      【解决方案2】:

      我打算建议不要捕获异常,所以在我建议我自己测试它之前,如果你将它设置为抛出所有异常,即使你不抛出异常,它仍然会抛出所有异常。我必须同意 Shiv Kumar 的意见,要么在调试应用程序时调整设置,要么接受你所做工作的限制。

      bool.TryParse 工作的原因是它验证每个字符,类似于 Int32.TryParse 确保字符串中的每个字符是 0-9 或任何其他有效的数字符号。

      您当然可以编写自己的网络类,并且在连接失败时不抛出异常。

      TryParse 不会抛出异常,如果您使用 bool.Parse,则必须通过 try{}catch{} 捕获任何抛出的异常,否则如果您尝试解析非布尔值的内容,它将抛出未处理的异常. TryParse 是在 .NET 的历史后期添加的,Parse 更多的是经典方法,允许程序员在尝试解析数据之前处理所有意外输入并验证输入。

      我应该补充一点,如果 TryParse 无法解析方法的结果为 false 且我相信的 out 变量为 false 的值,它将返回 false。至少 Int32 是这种情况

      http://msdn.microsoft.com/en-us/library/system.boolean.tryparse.aspx

      我想指出 TryParse 和 Parse 是如何工作的重点是,与 TcpClient 相比,它们是完全不同的野兽。我想我应该澄清一下基本的验证过程是相似的,除了一个抛出异常,另一个没有,当然还有一个返回实际解析的内容。

      【讨论】:

      • (有点跑题了):我假设 bool.TryParse 和 Parse 的内部工作是相同的(即它们以相同的方式检查字符串),除了后者抛出异常如果输入有问题。你是说不是这样吗?
      • @Srekel 查看我修改后的答案。
      猜你喜欢
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 2015-10-20
      相关资源
      最近更新 更多