2014-11-14 3 views
0

У меня есть список IP-адресов сервера и часть моего приложения перед отправкой запроса на каждый сервер, я пингует его. Когда я тестирую его через VS 2012, частично просматриваю, он останавливается и отображает страницу в VS, говоря «Невозможно подключиться к удаленному серверу». У меня есть ping в try-catch, но он не попадает в раздел исключений; он просто умирает, исполняя ping.send(). Некоторые из других пингов тайм-аут, и я их поймаю и отображаю надлежащее сообщение. Когда я проверяю след исключения (ниже), он говорит: «Никакое соединение не может быть сделано, потому что целевая машина активно отказалась от него». Есть ли способ поймать и обработать это, а не остановить запуск программы?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: 

Когда я вручную пинг этот сервер (56.245.253.10), он отвечает.

+0

Какое исключение вы поймаете? Это во время отладки? Что произойдет, если вы нажмете F5/продолжите отладку? – rene

+0

У вас уже есть 'try' вокруг этого кода, так как выглядит' catch'? Кроме того, вы можете нажать «Ctrl + Alt + E» и установить/снять отметку «Брошено» в разделе «Исключения общего времени выполнения языка», чтобы ваш отладчик предоставил больше/меньше информации об исключениях в вашей программе. – gunr2171

+0

Более простой вопрос: когда VS останавливает вашу программу из-за исключения, она выделяет строку. Какого цвета это? Если он желтый, вы не обрабатываете исключение. Если это зеленый-иш, он будет обработан, и вы можете нажать F5, чтобы продолжить работу. – gunr2171

ответ

1

Если вы просто хотите проверить, если сервер активен методом пинг, вы можете попробовать это

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; 
    } 

Он работает асинхронно так не блокирует ваш основной поток. Вы должны позвонить ему с помощью оператора ожидания из другого метода асинхронизации

+0

Он умирает в mypinger.Send (ip) и не попадает в секцию catch. Есть другие IP-адреса, которые тайм-аут, и все в порядке. Даже это нормально, если я могу найти способ поймать ошибку, записать ее и продолжить. – NoBullMan

+0

Несвязанный совет: 'reply.Status == IPStatus.Success' является логическим выражением, поэтому просто назначьте это' pingable'. –

+0

да @BrianRasmussen, но изначально, когда я закодировал, что у меня этого не было, и я слишком ленив, чтобы изменить его позже ;-) –