代码之家  ›  专栏  ›  技术社区  ›  Srekel

如何检查服务器是否在无异常处理的情况下侦听

  •  4
  • Srekel  · 技术社区  · 14 年前

    我正在开发两个应用程序,它们使用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,我必须按continue。

    我得到的例外是:

    无法建立连接,因为目标计算机已主动拒绝127.0.0.1:50000

    我可以想象,有一种方法可以检查服务器是否正在监听某个特定端口,而不必实际尝试连接到该端口。我知道仅仅检查是不够的-服务器可能会在检查和连接尝试之间关闭,但在我开发它的时候对我来说还是更好的。

    或者像这样的:

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

    与此类似:

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

    我还尝试使用异步方法(Begin/End Connect)并手动设置ManualResetEvent的超时,但这也不起作用。我搜遍了互联网,但还没找到解决这个问题的办法,所以我终于在这里发帖了:)

    2 回复  |  直到 14 年前
        1
  •  4
  •   Shiv Kumar    14 年前

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

    在VS中,在Debug菜单中,选择“Exceptions…”,在显示的对话框中,您可以控制它。

        2
  •  1
  •   Security Hound    14 年前

    我本来打算建议不要捕获异常,所以在我建议自己测试它之前,如果设置为抛出所有异常,即使不抛出异常,它的所有异常仍将被抛出。我将不得不同意希夫库马尔,要么调整你的设置,而你调试你的应用程序,或接受你所做的限制。

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

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

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

    我应该补充一点,如果TryParse不能同时解析方法结果为false和输出变量为false的值,它将返回false

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

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