我在传递无效的IP-0.0.0.51时遇到了SendAsync方法的一些问题

问题是,回调方法(pingSender_PingCompleted)甚至没有被调用。我没有看到任何错误。

Ip地址。TypeParse发现此IP为"有效"IP。

这是我的代码;请让我知道我在这里看不到什么。

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Program c = new Program();

            try
            {
                c.PingStore("0.0.0.51");
                Console.WriteLine("Pinged without exceptions");
            }
            catch (Exception ex) 
            {
                Console.WriteLine(ex.Message);
            }
        }

        private void PingStore(string ipAddress)
        {
            Ping pingSender = new Ping();

            pingSender.PingCompleted += new PingCompletedEventHandler(pingSender_PingCompleted);

            pingSender.SendAsync(ipAddress, null);
        }

        private void pingSender_PingCompleted(object sender, PingCompletedEventArgs e)
        {
            Console.WriteLine("PingCompleted invoked. continue to be happy");
        }
    }
}

请注意,我不能:

  1. 对ipAddress的内容有任何控制

  2. 使用正则表达式使我的代码复杂化

有帮助吗?

解决方案

我已经在一个简单的控制台应用程序中测试了你的两种方法,我得到了 PingException0.0.0.51 正如 itsme86 评论道。

这是我对正在发生的事情的猜测:您的评论"我期待这种方法同时被称为100次。"加 pingSender_PingCompleted 没有被调用意味着你正在调用 PingStore 工作线程上的方法(例如使用 ThreadPool).这就是为什么你不能抓住 PingException 在你的主线程上 pingSender_PingCompleted 从不因异常而被调用。

更新资料

在您的评论中,您写道:"仅供参考,我在.Net4.0上。".

您是否100%确定,您的应用程序的目标是v4.0,而不是v3.5或更早版本?

我能够使用您的确切代码重现您的问题,但是当针对.NET Framework v3.5时(对于v4.0,使用您的代码引发异常)。

我在系统中做了一些挖掘。两个框架版本的dll,这是我发现的:

  • 两个框架版本都在 Ping 方法中的类 private PingReply InternalSend(...) 使用native方法 num = (int)UnsafeNetInfoNativeMethods.IcmpSendEcho2.
  • 在错误的情况下 num 被设置为 0, ,并且我发现每个框架版本都以不同的方式处理这种情况。

框架v3.5/2.0:

if (num == 0)
{
    num = Marshal.GetLastWin32Error();
    if (num != 0)
    {
        this.FreeUnmanagedStructures();
        return new PingReply((IPStatus)num);
    }
}

Framewrk v4.0/4.5:

if (num == 0)
{
    num = Marshal.GetLastWin32Error();
    if (async && (long)num == 997L)
    {
        return null;
    }
    this.FreeUnmanagedStructures();
    this.UnregisterWaitHandle();
    if (async || num < 11002 || num > 11045)
    {
        /* NOTE! This throws the exception for 0.0.0.51 address that you're not getting */
        throw new Win32Exception(num);
    }
    return new PingReply((IPStatus)num);
}

正如您在上面的代码片段中看到的,在.NET v4.0中,您应该能够捕获异常,而在.NET v3.5中,所有本机WIN32错误都以静默方式处理。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top