使用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);
}
}
为什么过了一段时间我一直在变假?非常感谢。
您正在向服务器发送大量请求:
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");