Я пытаюсь установить соединение сокета с адресом хоста/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);
}
}
Я бы улучшил обработку исключений. Устранение общего исключения и обработка как конкретного сбоя сети/соединения не рекомендуется. Также попробуйте помещать ваши закрытые/завершающие/стоп-вызовы в блок «finally» .... кроме того, я думаю, что это выглядит нормально .. –