@ViX_EL
Разработчик C++

Как правильно сделать программную проверку качества соединения с сайтом?

Задача - проверить качество соединения с сайтом и само наличия соединения. К сайту подключение происходит только через специальный vpn. Я написал следующий код, который проверяет доступность сайта, если vpn выключен, то соединения не будет. А так же замеряю пинг до сайта и из него делаю предположение о качестве соединения. Меня гложат сомнения правильно ли я сделал и не похоже ли это на ддос, т.к. я часто отправляю запросы серверу? Пользователей программы будут десятки. Если что я новичок в сетевом программировании, подскажите пожалуйста и укажите на ошибки.
internal class ConnectionInfo
    {
        static HttpClient client = new HttpClient();
        TextBlock connectionLabel;
        TextBlock pingLabel;

        public const long pingNoConnection = 999;
        public long ping {get; private set;} = pingNoConnection;
        public string status { get; private set; } = "-";

        public ConnectionInfo(ref TextBlock connectionLabel, ref TextBlock pingLabel) 
        {
            client.Timeout = TimeSpan.FromSeconds(2);
            this.connectionLabel = connectionLabel;
            this.pingLabel = pingLabel;
        }

        public async Task<long> PingSite(string hostNameStr)
        {
            try
            {
                Ping pingSender = new Ping();
                Task<PingReply> replyTask = pingSender.SendPingAsync(hostNameStr);

                PingReply reply = await replyTask;
                return reply.RoundtripTime;
            }
            catch
            {
                return pingNoConnection;
            }
        }

        public static async Task<string> ConnectionSiteStatus(string serverStr)
        {
            string resultStr;
            try
            {
                using var result = await client.GetAsync(serverStr);
                resultStr = result.StatusCode.ToString();
            }
            catch
            {
                resultStr = $"Нет подключения к {serverStr}";
            }
            return resultStr;
        }

        // Функция обновления статуса подключения и пинга
        public async Task Update()
        {
            while (true)
            {
                await Task.Delay(1000);
                status = await ConnectionSiteStatus("https://cis.bccipmt.com");
                if (status != "OK")
                {
                    connectionLabel.Text = "Подключение к CIS отсутствует";
                    connectionLabel.Foreground = Brushes.Red;
                    pingLabel.Text = "";
                }
                else
                {
                    //connectionLabel.Text = $"Подключение: {responceStr}";
                    connectionLabel.Foreground = Brushes.Lime;

                    ping = await PingSite("cis.bccipmt.com");
                    string connectionQualityStr;
                    switch (ping)
                    {
                        case > 90:
                            connectionLabel.Foreground = Brushes.Red;
                            pingLabel.Foreground = Brushes.Red;
                            connectionQualityStr = "плохое";
                            break;
                        case > 50:
                            connectionLabel.Foreground = Brushes.Yellow;
                            pingLabel.Foreground = Brushes.Yellow;
                            connectionQualityStr = "среднее";
                            break;
                        case < 50:
                            connectionLabel.Foreground = Brushes.Lime;
                            pingLabel.Foreground = Brushes.Lime;
                            connectionQualityStr = "хорошее";
                            break;
                        default:
                            connectionQualityStr = "неизвестно";
                            break;
                    }
                    pingLabel.Text = $"Ping: {ping}";
                    connectionLabel.Text = $"Соединение: {connectionQualityStr}";
                }
            }
        }
    }
  • Вопрос задан
  • 109 просмотров
Пригласить эксперта
Ответы на вопрос 2
GavriKos
@GavriKos
Подзадача - определиться с термином "качество". пинг - не показатель качества. И к сайту не относится - другой уровень.
Что такое качество? Скорость загрузки сайта? Но на это влияет не только канал, так что речь не о качестве соединения.
Ответ написан
@d-stream
Готовые решения - не подаю, но...
Мониторинг. Можно гуглить 4 golden SRE signals для понимания. Главное - это понимание что показатели являются не одномоментными, а измеряются на интервалах времени.

В общем-то это получается слегка сторонний кусок, но System.Diagnostics, OpenTelemetry и другие средства инструментирования позволяют-таки тащить метрики. Не внося изменений в сам сутевой код приложения.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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