使用C#ping服务器

时间:2012-03-09 13:02:22

标签: c# networking network-programming

我试图使用Ping类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 个答案:

答案 0 :(得分:10)

您的服务器充满了请求:

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

将在请求后尽可能快地循环发送请求。

如果您只是编写保持活动服务或服务状态控制的编码,那么使用每分钟甚至每10分钟ping一次的计时器应该足够好。

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

答案 1 :(得分:1)

我重写了你的代码。

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

答案 2 :(得分:0)

对于此页面的其他绊脚石,如果将此函数重写为:

,则此功能会更好
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");