2013-08-27 2 views
2

Я пытаюсь установить соединение сокета с адресом хоста/ip для определенного порта. Основные вещи, я стараюсь достичь являются:C# connection check connection

  • получить время отклика в миллисекундах для будки успеха/незачет подключение
  • использовать пользовательский тайм-аут, например, 5 секунд (5000)

Так в основном, если Я указываю имя хоста, как google.com и порт 80, это должно проверить, работает ли соединение, то же самое, если я укажу 173.194.70.101 и порт 80, он должен работать.

Если я укажу, например, имя хоста, как google.com и порт 7788, это не должно работать, потому что этот порт не открыт. Если я укажу IP: 173.194.70.101 и порт '7788 ', это не должно работать.

Если я укажу какой-нибудь случайный хост, такой как sdfzsdfaklsf.com и порт 7788, это не должно работать, потому что хост не существует.

Для всех вышеперечисленных случаев мне нужно время отклика для всех успеха/незачет ...

Я закончил с этим кодом и швы работать нормально, однако я хотел бы спросить, если это правильный путь делать это?

 public string CheckConnection(string ipAddressOrHostName, string portName) 
    { 
     Stopwatch timer = new Stopwatch(); 
     timer.Start(); 
     Socket server = null; 
     string elapsed = string.Empty; 

     try 
     { 

      IPHostEntry hostEntry = Dns.GetHostEntry(ipAddressOrHostName); 

      IPAddress ipAddress = hostEntry.AddressList[0]; 

      IPEndPoint ip = new IPEndPoint(ipAddress, Convert.ToInt32(portName)); 

      server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

      IAsyncResult result = server.BeginConnect(ip, null, null); 

      result.AsyncWaitHandle.WaitOne(5000, true); 

      timer.Stop(); 

      elapsed = timer.ElapsedMilliseconds.ToString(); 


      if (!server.Connected) 
      {      
       server.Close(); 
       throw new Exception(); 
      } 
      else 
      { 
       string status = string.Format("Connected succesfully to: {0} in: {1} milliseconds", server.RemoteEndPoint.ToString(), elapsed);     
       server.Shutdown(SocketShutdown.Both); 
       server.Close(); 

       return status; 
      } 
     } 
     catch (Exception) 
     { 
      timer.Stop(); 

      elapsed = timer.ElapsedMilliseconds.ToString(); 

      return string.Format("Connection failed to: {0}:{1} in: {2} milliseconds", ipAddressOrHostName, portName, elapsed);      
     } 

    } 
+0

Я бы улучшил обработку исключений. Устранение общего исключения и обработка как конкретного сбоя сети/соединения не рекомендуется. Также попробуйте помещать ваши закрытые/завершающие/стоп-вызовы в блок «finally» .... кроме того, я думаю, что это выглядит нормально .. –

ответ

2

Это очень хорошо. Несколько точек:

  1. Поймать более конкретный тип исключения и протестировать его. Вы не хотите улавливать несвязанные вещи или скрывать ошибки.
  2. Запустить таймерпосле вы завершили настройку DNS.
  3. throw new Exception не очень хорошо, потому что исключения не предназначены для управления потоком. Перестройте метод, чтобы он не нуждался в этом взломе.
  4. Возможно, вы захотите использовать задачи вместо IAsyncResult. Никаких функциональных изменений, просто более современный стиль.
  5. У вас есть избыточность в нескольких местах (например, дубликат закрытия, дубликат ToString).
  6. Разберите порт вне метода. Это не принадлежит. На самом деле, если порт неповторим, вы вызовете предполагаемый тайм-аут на данный момент, потому что будет выбрано исключение. Это то, о чем я вас предупреждаю, с точкой (1). Использование исключений слишком сильно вызвало ошибку, о которой вы, возможно, никогда не узнали бы, потому что она была скрыта.
+0

Можете ли вы рассказать, как я могу реализовать async ждут вместо IAsyncResult? –

+0

Я думаю, что это выходит за рамки этого вопроса. Найдите «ожидание сокета», чтобы найти ответ. Если у вас есть дополнительные вопросы, дайте мне знать. – usr

+0

Я реализовал async-wait, а не IAsyncResult, но я потерял контроль над пользовательским тайм-аутом, который по умолчанию составляет 20 секунд, я думаю ... но в любом случае спасибо за ваши комментарии! –