C# Ping导致未处理的异常

C# Ping导致未处理的异常,c#,.net-4.5,ping,C#,.net 4.5,Ping,我有一个服务器IP地址列表,在我的应用程序的一部分中,在向每个服务器发送请求之前,我会ping它。当我在VS 2012中测试它时,它会停止并在VS中显示一个页面,上面写着“无法连接到远程服务器”。我有一个尝试捕捉的ping,但它不属于异常部分;它只是在执行ping.send()时死亡。其他一些ping超时,我捕获这些ping并显示正确的消息。当我检查异常跟踪(如下)时,它说:“无法建立连接,因为目标机器主动拒绝它”。有没有办法捕捉并处理这个问题,而不是阻止程序运行 这是(部分)ping代码: p

我有一个服务器IP地址列表,在我的应用程序的一部分中,在向每个服务器发送请求之前,我会ping它。当我在VS 2012中测试它时,它会停止并在VS中显示一个页面,上面写着“无法连接到远程服务器”。我有一个尝试捕捉的ping,但它不属于异常部分;它只是在执行ping.send()时死亡。其他一些ping超时,我捕获这些ping并显示正确的消息。当我检查异常跟踪(如下)时,它说:“无法建立连接,因为目标机器主动拒绝它”。有没有办法捕捉并处理这个问题,而不是阻止程序运行

这是(部分)ping代码:

public static string PingServer(string host)
{
    PingOptions options = new PingOptions();
    options.DontFragment = true;
    Ping p = new Ping();
    PingReply reply = null;
    string NetworkMessage = string.Empty;

    try
    {
        string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        byte[] buffer = Encoding.ASCII.GetBytes(data);
        int timeout = 120;
        Console.WriteLine(host);
        reply = p.Send(host, timeout, buffer, options);
这是异常跟踪:

System.Net.WebException was unhandled
  HResult=-2146233079
  Message=Unable to connect to the remote server
  Source=System
  StackTrace:
       at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
       at PASSCrawlerNS.PASSCrawler.GetResponseCallback(IAsyncResult ar) in c:\Users\blah\Documents\Visual Studio 2012\Projects\test\test\Program.cs:line 102
       at System.Net.LazyAsyncResult.Complete(IntPtr userToken)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Net.ContextAwareResult.Complete(IntPtr userToken)
       at System.Net.HttpWebRequest.SetResponse(Exception E)
       at System.Net.ConnectionReturnResult.SetResponses(ConnectionReturnResult returnResult)
       at System.Net.Connection.CompleteConnectionWrapper(Object request, Object state)
       at System.Net.PooledStream.ConnectionCallback(Object owningObject, Exception e, Socket socket, IPAddress address)
       at System.Net.ServicePoint.ConnectSocketCallback(IAsyncResult asyncResult)
       at System.Net.LazyAsyncResult.Complete(IntPtr userToken)
       at System.Net.ContextAwareResult.Complete(IntPtr userToken)
       at System.Net.Sockets.Socket.ConnectCallback()
       at System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(Object state, Boolean timedOut)
  InnerException: System.Net.Sockets.SocketException
       HResult=-2147467259
       **Message=No connection could be made because the target machine actively refused it** 56.245.253.10:80
       Source=System
       ErrorCode=10061
       NativeErrorCode=10061
       StackTrace:
            at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
            at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)
   InnerException: 

当我手动ping此服务器(56.245.253.10)时,它会回复。

如果您只想通过ping方法测试服务器是否处于活动状态,可以尝试此方法

    private async Task<bool> PingHost(string ip)
    {
        bool pingable = true;
        Ping mypinger = new Ping();
        try
        {
            PingReply reply = mypinger.Send(ip);
            pingable = (reply.Status == IPStatus.Success) ? true : false;
        }
        catch (PingException)
        {
            return false;
        }
        return pingable;
    }
专用异步任务PingHost(字符串ip)
{
bool pingable=true;
Ping mypinger=new Ping();
尝试
{
PingReply=mypinger.Send(ip);
pingable=(reply.Status==IPStatus.Success)?true:false;
}
捕获(异常)
{
返回false;
}
返回pingable;
}

它异步运行,因此不会阻塞主线程。您必须使用另一个异步方法的wait运算符调用它

捕获的异常是什么?这是在调试期间发生的吗?如果按F5/继续调试会发生什么情况?在该代码周围已经有了一个
try
,那么
catch
是什么样子的?此外,您可以按Ctrl+Alt+E并选中/取消选中“公共语言运行时异常”下的“抛出”,让调试器提供有关程序中异常的更多/更少信息。更简单的问题是:当VS因异常而停止程序时,它会突出显示该行。它是什么颜色的?如果为黄色,则不处理异常。如果它是绿色的,它将被处理,您可以点击F5继续运行。为什么您要在美国邮政服务范围内ping an IP?为什么堆栈跟踪中有一个名为PASSCrawler的东西?实际上,我包含的跟踪包含异常。它说:“Message=无法建立连接,因为目标机器主动拒绝了它56.245.253.10:80”。我可以从控制台ping它,它会回复。我没有包括捕捉部分的原因是因为它没有落入其中。它尝试执行ping.send()并在那里终止。它在mypinger.send(ip)中终止,不属于catch部分。还有其他IP超时,没关系。即使这样,如果我能找到捕获错误的方法,也没问题,记录下来,然后继续。不相关的提示:
reply.Status==IPStatus.Success
是一个布尔表达式,所以只需将它指定给
pingable
。是@BrianRasmussen,但最初我编码时没有考虑到这一点,我懒得以后再修改;-)@诺布尔曼:“死”是什么意思?可能您的服务器或internet速度较慢,因此需要时间进行ping。我的意思是,它不属于异常部分。它尝试执行ping.send(),然后在Visual studio中打开某些页面,错误为“无法连接到远程服务器”。然而,在VS页面中,我可以要求显示细节异常,在那里我可以看到我包含的跟踪。我有一个选择(我认为)是完全绕过ping,只向服务器发送请求并检查响应状态。