Определите, доступно ли интернет-соединение

Мой лучший ток (в x86 блоке):

push eax
jmp short $-1

, который приводит к 3 байтам объектного кода (50 EB FD). Для 16-разрядного кода это также возможно:

call $

, который также приводит к 3 байтам (E8 FD FF).

13
задан Community 23 May 2017 в 12:16
поделиться

7 ответов

Я попробовал ссылку, предложенную Webleeuw, но этому коду также требуется от 4 до 10 секунд, чтобы уведомить меня, когда я подключаю или отключаю кабель. Теперь я хотел знать, это мой компьютер или установка, и написал свой собственный класс Observer, основанный на NetworkInterface.GetAllNetworkInterfaces ().

И: Он работает с молниеносной скоростью. Мое приложение теперь реагирует так же быстро, как и лоток. Код далек от производственного кода, это просто быстрый взлом. Но это то, на чем я буду опираться сейчас:)

using System;
using System.Net.NetworkInformation;
using Timer=System.Threading.Timer;

namespace NetworkCheckApp
{
public class NetworkStatusObserver
{
    public event EventHandler<EventArgs> NetworkChanged;

    private NetworkInterface[] oldInterfaces;
    private Timer timer;

    public void Start()
    {
        timer = new Timer(UpdateNetworkStatus, null, new TimeSpan(0, 0, 0, 0, 500), new TimeSpan(0, 0, 0, 0, 500));

        oldInterfaces = NetworkInterface.GetAllNetworkInterfaces();
    }

    private void UpdateNetworkStatus(object o)
    {
        var newInterfaces = NetworkInterface.GetAllNetworkInterfaces();
        bool hasChanges = false;
        if (newInterfaces.Length != oldInterfaces.Length)
        {
            hasChanges = true;
        }
        if (!hasChanges)
        {
            for (int i = 0; i < oldInterfaces.Length; i++)
            {
                if (oldInterfaces[i].Name != newInterfaces[i].Name || oldInterfaces[i].OperationalStatus != newInterfaces[i].OperationalStatus)
                {
                    hasChanges = true;
                    break;
                }
            }
        }

        oldInterfaces = newInterfaces;

        if (hasChanges)
        {
            RaiseNetworkChanged();
        }
    }

    private void RaiseNetworkChanged()
    {
        if (NetworkChanged != null)
        {
            NetworkChanged.Invoke(this, null);
        }
    }
}
}
9
ответ дан 2 December 2019 в 00:46
поделиться

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

0
ответ дан 2 December 2019 в 00:46
поделиться

Значок в области уведомлений Windows, скорее всего, связан с драйверами сетевой карты, то есть ниже уровня операционной системы, поэтому он может реагировать так быстро.

Поскольку сетевая карта является только одной из между вашим клиентом и службой, к которой он обращается в Интернете, единственный надежный способ определить, доступен ли Интернет, - это запросить какую-либо службу в Интернете, почти так же, как это делает ping. В сетях TCP / IP это известно как keepalive, и многие протоколы имеют это встроенное в качестве опции.

0
ответ дан 2 December 2019 в 00:46
поделиться

О пинге: в зависимости от того, как вы хотите интерпретировать результаты, пинг мне не кажется непреодолимым. Что делать, если время ожидания цели истекает время от времени, пока соединение остается активным? Мне еще предстоит увидеть сервер, который никогда не перестанет отвечать на пинг.

Проверка каждого X миллисекунд, если сетевой интерфейс все еще в сети (свойство NetworkInterface.OperationalStatus), кажется более надежным, если вы спросите меня.

РЕДАКТИРОВАТЬ : В этой статье рассматриваются события сетевого адреса на более низком уровне, чем класс System.Net.NetworkInformation.NetworkChange, по крайней мере, так кажется. На моем компьютере это работает очень быстро, поэтому, надеюсь, вы сможете использовать это решение.

0
ответ дан 2 December 2019 в 00:46
поделиться

Вы можете использовать ping, но я бы также построил простой вызов, чтобы вернуть «да», если он подключен. Таким образом вы узнаете, работает ли сервер и работает ли на нем ваш код. Также я звоню или пингую только тогда, когда требуется сетевой ресурс, а не постоянно.

0
ответ дан 2 December 2019 в 00:46
поделиться

Выполнение проверки связи определенно не самый лучший вариант, особенно если это веб-сервер. . Некоторые хосты отключают ответ на трафик ICMP, поэтому вы можете пинговать, но не получите ответа. Как насчет простой обработки исключения, когда оно возникает?

0
ответ дан 2 December 2019 в 00:46
поделиться

Попробуйте это с помощью NetworkChange class

using System.Net.NetworkInformation

private void Form5_Load(object sender, EventArgs e)
{
    NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged);
}

private void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
{
    if (e.IsAvailable)
    {
        MessageBox.Show("Available");
    }
    else
    {
        MessageBox.Show("Not available");
    }
}
2
ответ дан 2 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

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