Проверка связи с сервером с использованием C # - PullRequest
0 голосов
/ 09 марта 2012

Я пытался пропинговать сервер, используя класс Ping, но после примерно 10 раз, когда метод возвращает true, я продолжаю получать false (что означает, что сервер не работает [?], А это не так).

     public bool IsConnectedToInternet()
    {
            Ping p = new Ping();
            try
            {

                PingReply reply = p.Send("www.uic.co.il", 1000);
                if (reply.Status == IPStatus.Success)
                    return true;
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());    
            }
            return false;
    }

    private void start_Click(object sender, EventArgs e)
    {
        for (; ; )
        {
            Console.WriteLine(IsConnectedToInternet);


        }
    }

Почему я продолжаю становиться ложным через некоторое время? Спасибо.

Ответы [ 3 ]

10 голосов
/ 09 марта 2012

Вы заполняете сервер запросами:

for (; ; )
{
    Console.WriteLine(IsConnectedToInternet);
}

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

Если вы просто кодируете службу поддержки активности или контроль состояния службы, тогда достаточно использовать таймер, который пингует каждую минуту или даже каждые 10 минут.

Кроме того, как другие отмечали в своих комментариях, вы злоупотребляете свойствами, выполняя эхо-запрос в получателе, поскольку вызов может потенциально занять некоторое время, и получатели свойства должны действительно вернуться, если не сразу, то очень быстро. У CheckConnection() метода было бы более ясное намерение.

1 голос
/ 09 марта 2012

Я переписал ваш код.

Это вызовет событие с именем ConnectionLost, если соединение потеряно, и событие с именем Connected, когда оно снова подключится.

public class NetworkStateMonitor
{
    private System.Threading.Timer _timer;
    bool _wasConnected = false;

    public NetworkStateMonitor()
    {
        _timer = new System.Threading.Timer(OnPing, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10));
    }

    public bool CheckInternetConnection() 
    {
        bool result = false;
        Ping p = new Ping();
        try
        {
            PingReply reply = p.Send("www.uic.co.il", 1000);
            if (reply.Status == IPStatus.Success)
                return true;
        catch (PingException) 
        {
            return false;
        }
    }


    private void OnPing(object state)
    {
        var newState = CheckInternetConnection();
        if (!newState && _wasConnected)
            ConnectionLost(this, EventArgs.Empty);
        else if (newState && !_wasConnected)
            Connected(this, EventArgs.Empty);

        _wasConnected = newState;
    }

    public event EventHandler ConnectionLost = delegate{};
    public event EventHandler Connected = delegate{};
}
0 голосов
/ 21 ноября 2013

Для других преткновений на этой странице, эта функция была бы лучше, если бы она была переписана в:

public bool CheckInternetConnection(string HostName) 
{
    bool result = false; // assume error
    try {
        Ping oPing = new Ping();
        PingReply reply = oPing.Send(HostName, 3000);
        if (reply.Status == IPStatus.Success){
            result = true;
        }
    } catch (Exception E) {
        // Uncomment next line to see errors
        // MessageBox.Show(E.ToString());
    }
    return result;
}

Теперь вызовите используя:

bool IsSuccessful = CheckInternetConnection("www.uic.co.il");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...