YaKotikTvoy
@YaKotikTvoy
Стьюдик

Как проверить IP-адрес на то, что он существует?

У меня есть C# приложение, где я ввожу IP-адрес устройства, подключенного к моему телефону, через Wi-Fi, который раздаёт этот же телефон.
Вот если ввести белиберду, например 192..5151.77, то try catch отрабатывают и выбрасывают обратно на начальную страницу ввода IP.
Если ввести какой-то по формату правильный адрес там, например, 192.168.30.7, которого нет в списке подключенных устройств, и потом попытаться отправить данные на него, то приложение виснет, хотя я вставил часть кода, ответственного за отправку, в try catch.
Как мне проверить, что такой адрес вообще существует, и на него можно что-то отправить?
using System;
using System.Net.Sockets;
using System.Text;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace WindyBox
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class PowerPage : ContentPage
    {
        private string ip;
        private int port;
        private int value = 0;
        private double LastValue = 0;
        public PowerPage(string ip, int port)
        {
            InitializeComponent();
            this.ip = ip;
            this.port = port;
            Cooler.Source = ImageSource.FromResource("WindyBox.Resources.Cooler.png");
        }
        //Отправление значения, уменьшающее мощность на 1%.
        private void Minus1(object sender, EventArgs e)
        {
            if (!(LastValue - 3 < 0) && !(value - 1 < 0))
            {
                try
                {
                    TcpClient Client = new TcpClient();
                    Client.Connect(ip, port);
                    NetworkStream stream = Client.GetStream();
                    ValuePower.Text = $"{value - 1}%";
                    LastValue -= 3;
                    value -= 1;
                    string responce = Convert.ToString(LastValue);
                    byte[] data = Encoding.UTF8.GetBytes(responce);
                    stream.Write(data, 0, data.Length);
                    Client.Close();
                    stream.Close();
                }
                catch
                {
                    Navigation.PopModalAsync();
                }
            }
            else
            {
                try
                {
                    TcpClient Client = new TcpClient();
                    Client.Connect(ip, port);
                    NetworkStream stream = Client.GetStream();
                    ValuePower.Text = "0%";
                    value = 0;
                    string responce = Convert.ToString(0);
                    byte[] data = Encoding.UTF8.GetBytes(responce);
                    stream.Write(data, 0, data.Length);
                    Client.Close();
                    stream.Close();
                }
                catch
                {
                    Navigation.PopModalAsync();
                }
            }
        }
        //Отправление значения, уменьшающее мощность на 10%.
        private void Minus10(object sender, EventArgs e)
        {
            if (!(LastValue - 26 < 0) && !(value - 10 < 0))
            {
                try
                {
                    TcpClient Client = new TcpClient();
                    Client.Connect(ip, port);
                    NetworkStream stream = Client.GetStream();
                    ValuePower.Text = $"{value - 10}%";
                    LastValue -= 26;
                    value -= 10;
                    string responce = Convert.ToString(LastValue);
                    byte[] data = Encoding.UTF8.GetBytes(responce);
                    stream.Write(data, 0, data.Length);
                    Client.Close();
                    stream.Close();
                }
                catch
                {
                    Navigation.PopModalAsync();
                }
            }
            else
            {
                try
                {
                    TcpClient Client = new TcpClient();
                    Client.Connect(ip, port);
                    NetworkStream stream = Client.GetStream();
                    ValuePower.Text = "0%";
                    value = 0;
                    string responce = Convert.ToString(0);
                    byte[] data = Encoding.UTF8.GetBytes(responce);
                    stream.Write(data, 0, data.Length);
                    Client.Close();
                    stream.Close();
                }
                catch
                {
                    Navigation.PopModalAsync();
                }
            }
        }
        //Отправление значения, увеличевающее мощность на 10%.
        private void Plus10(object sender, EventArgs e)
        {

            if (LastValue + 26 < 255 && value + 10 < 100)
            {
                try
                {
                    TcpClient Client = new TcpClient();
                    Client.Connect(ip, port);
                    NetworkStream stream = Client.GetStream();
                    ValuePower.Text = $"{value + 10}%"; ;
                    LastValue += 26;
                    value += 10;
                    string responce = Convert.ToString(LastValue);
                    byte[] data = Encoding.UTF8.GetBytes(responce);
                    stream.Write(data, 0, data.Length);
                    Client.Close();
                    stream.Close();
                }
                catch
                {
                    Navigation.PopModalAsync();
                }
            }
            else
            {
                try
                {
                    TcpClient Client = new TcpClient();
                    Client.Connect(ip, port);
                    NetworkStream stream = Client.GetStream();
                    ValuePower.Text = "100%";
                    LastValue = 255;
                    value = 100;
                    string responce = Convert.ToString(255);
                    byte[] data = Encoding.UTF8.GetBytes(responce);
                    stream.Write(data, 0, data.Length);
                    Client.Close();
                    stream.Close();
                }
                catch
                {
                    Navigation.PopModalAsync();
                }
            }
        }

        //Отправление значения, увеличевающее мощность на 1%.
        private void Plus1(object sender, EventArgs e)
        {

            if (LastValue + 3 < 255 && value + 1 < 100)
            {
                try
                {
                    TcpClient Client = new TcpClient();
                    Client.Connect(ip, port);
                    NetworkStream stream = Client.GetStream();
                    ValuePower.Text = $"{value + 1}%"; 
                    LastValue += 3;
                    value += 1;
                    string responce = Convert.ToString(LastValue);
                    byte[] data = Encoding.UTF8.GetBytes(responce);
                    stream.Write(data, 0, data.Length);
                    Client.Close();
                    stream.Close();
                }
                catch
                {
                    Navigation.PopModalAsync();
                }
            }
            else
            {
                try
                {
                    TcpClient Client = new TcpClient();
                    Client.Connect(ip, port);
                    NetworkStream stream = Client.GetStream();
                    ValuePower.Text = "100%";
                    LastValue = 255;
                    value = 100;
                    string responce = Convert.ToString(255);
                    byte[] data = Encoding.UTF8.GetBytes(responce);
                    stream.Write(data, 0, data.Length);
                    Client.Close();
                    stream.Close();
                }
                catch
                {
                    Navigation.PopModalAsync();
                }
            }
        }
        //Обратно на страницу ввода IP.
        private async void BackMainPage(object sender, EventArgs e)
        {
            await Navigation.PopModalAsync();
        }
    }
}
  • Вопрос задан
  • 239 просмотров
Решения вопроса 1
hekkaaa
@hekkaaa
C#/.NET Developer
Привет!
Как вижу, вы пытаетесь сразу подключиться по TCP к указанному ip адресу.
Вариант1: Рекомендую проверить доступность данного хоста вообще ICMP запросом.
В ICMP ответе Вам прилетит статус ответа Timeout или Success (или что-то иное плохое), по нему и решайте доступен ли хост (хотя это не 100% гарантия. На устройстве может быть отключен ответ на ICMP запросы).
Рекомендую высылать более 1 ICMP пакета для проверки, т.к 1 может быть Timeout из-за того что устройство только проснулось например.

Можно воспользоваться стандартной библиотекой System.Net.NetworkInformation и классом в нем Ping
Вариант второй у меня есть библиотека в nuget NetObserver которая делает такие запросы в классе IcmpRequestSender без предварительного чтения мануала.

629a3f09b8c81851947824.png

Вариант 2: Делаете подключение TcpClient отдельным потоком. Вешаете туда флаг в код, после строчки коннекта. Если флаг не поднят например более 10 секунд, то гасите поток. Значит хост не доступен.
Для этого Вам вероятно нужно будет делает наблюдатель за открывающимися потоками, либо найти фрейморк который так работает.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы