使用C#Ping服务器

本文关键字:服务器 C#Ping 使用 | 更新日期: 2023-09-27 18:27:11

我试图使用ping类对服务器进行ping,但在该方法返回true大约10次后,我一直得到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);

        }
    }

为什么过了一段时间我一直在变假?非常感谢。

使用C#Ping服务器

您正在向服务器发送大量请求:

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

将以尽可能快的速度循环发送一个又一个请求。

如果你只是在编码一个保持活动的服务或服务状态控制,那么使用每分钟甚至每10分钟ping一次的计时器就足够了。

此外,正如其他人在评论中指出的那样,您在getter中执行ping操作是在滥用属性,因为调用可能需要一些时间,属性getter应该真正返回,如果不是立即返回,那么应该非常快。CheckConnection()方法将具有更明确的意图。

我重写了您的代码。

如果连接丢失,它将触发一个称为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{};
}

对于本页中的其他问题,如果将此函数重写为:,效果会更好

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");