Ping总是成功的,不能很容易地在url上使用Ping来检查正常运行时间
本文关键字:Ping 检查 运行时间 url 成功 很容易 不能 | 更新日期: 2023-09-27 17:47:25
我很沮丧,因为OpenDNS和其他服务(即:roadrunner)现在总是返回ping,即使你键入任何无效的url(即:lkjsdaflkjdsjf.com)——我创建了一个自己使用的软件,可以ping一个url来验证网站是否打开。这不再有效。有人对此有什么想法吗?
要求:
- 它应该适用于任何有效的网站,即使是我无法控制的网站
- 它应该能够从任何可以访问互联网的网络上运行
我非常希望听到其他人现在如何处理这件事。我想补充一点,我试图在c#中使用System.Net来完成这项工作
非常感谢:-)
新添加:正在寻找一个解决方案,我可以购买并在我的windows机器上运行,也可以用c#编程。:-)
更新:
非常感谢大家的回答。最终,我通过这样做创建了一个解决方案:
- 创建一个简单的Web客户端,从url下载指定的页面(可能会更改为仅标题或使用它来通知页面更改)
- 读入xml文件,该文件仅列出要检查的网站/页面的完整url
- 创建了一个windows服务来承载解决方案,以便恢复服务器重新启动
- 出现错误时,将向定义的收件人列表发送电子邮件和文本消息
- 大多数值(interval、smtp、to、from等)都在.config中定义,以便于更改
稍后我将听取您的一些建议,为其添加"功能",其中包括:
- AJAX页面用于实时监控。我将使用WCF从asp.net页面连接到现有的windows服务
- 仅下载标题(带有页面更改比较选项)
- 使可配置性更强(即:在通知之前重试失败)
Wget是一个不错的选择。它不仅会检查机器是否处于活动状态,还会检查HTTP服务器是否接受连接。
您可以创建一个简单的网页,其中包含网站的地址栏和一些使用AJAX访问网站的javascript。如果您在异步回调中得到除200以外的任何HTTP响应,则表明该站点不工作。
<html>
<head>
<script language="javascript" type="text/javascript">
<!--
var ajax = new XMLHttpRequest();
function pingSite() {
ajax.onreadystatechange = stateChanged;
ajax.open('GET', document.getElementById('siteToCheck').value, true);
ajax.send(null);
}
function stateChanged() {
if (ajax.readyState == 4) {
if (ajax.status == 200) {
document.getElementById('statusLabel').innerHTML = "Success!";
}
else {
document.getElementById('statusLabel').innerHTML = "Failure!";
}
}
}
-->
</script>
</head>
<body>
Site To Check:<br />
<input type="text" id="siteToCheck" /><input type="button" onclick="javascript:pingSite()" />
<p>
<span id="statusLabel"></span>
</p>
</body>
这段代码取决于浏览器不是IE,我还没有测试过它,但它应该会给你一个很好的主意。
要查看服务是否启动,不仅应该ping,而且最好有能够命中服务(如网站)并返回有效响应的脚本。我过去用过What's Up Gold,而不是自己写。我喜欢这类产品的所有功能。例如在服务中断时向我发送页面。
记录在案,lkjsdaflkjdsjf.com是一个主机名(目前尚未向任何人注册)。ping不适用于URL,ping适用于主机名。主机名是使用域名系统查找的。当主机名未注册时,DNS应该会失败。
问题是,有些服务(显然是你的ISP,当然还有OpenDNS)不会让未注册主机名的DNS请求失败。相反,他们返回网络上的主机的IP地址,该主机为任何http请求提供搜索页面。
你似乎想知道两件事:这个名字是真的吗(也就是说,有没有一个主机用这个名字注册到某台实际的机器上)?那台机器能用吗?
如果你已经知道这个名字是真实的(例如,你想知道www.google.com是否在运行),那么你可以使用ping,因为你知道这个名字会解析为一个真实的地址(ISP不能返回注册名称的IP),你只会测量这台机器是否在运行。
如果你不知道这个名字是否是真的,那么问题就更难了,因为你的ISP向你的DNS请求返回了虚假数据。这里唯一的解决方案是找到一个DNS服务器,它不会在未解析的名称上对你撒谎。
我能想到的区分ISP虚假记录和真实记录的唯一方法是对你得到的IP进行反向查找,看看该IP是否在你的ISP网络中。这个技巧的问题是,如果ISP没有该IP的反向DNS信息,你就不知道是ISP还是某个傻瓜没有正确配置他的DNS(我过去犯过很多次这个错误)。
我相信还有其他技术,但DNS隐藏在一切之下的事实使处理这个问题变得困难。
我不直接知道c#中有任何现成的选项,尽管如果没有几个可用的选项,我会非常惊讶。
几年前我写了类似的东西,不再有代码了,因为它属于其他人,但基本想法是使用WebClient访问域默认页面,并检查http状态代码为200。
然后,您可以围绕此操作的成功或失败关联任何通知逻辑。
如果带宽是一个问题,您可以将其修剪为只使用HEAD请求。
对于您控制的更复杂的站点,您可以连接一个健康监测页面,在发送响应之前进行更多的深度测试,例如数据库连接等。
通常,端口80上的机器仍然会对ping做出响应,因此测试端口80(或您感兴趣的任何其他端口)将是一种更可靠的方法。
我发现ping非常不可靠,因为你必须跳过所有的跳跃,而介于两者之间的东西总是会干扰。
尝试打开与web服务器的http连接可能是最好的方法。
如果您有可用的cygwin或,您可以尝试运行"httping"
http://freshmeat.net/projects/httping/
据我所见,这里的问题是OpenDNS将无效域解析回自己,以将您转发到与您想要的内容接近的位置(因此,如果您键入ggooggglee.com,您最终会通过OpenDNS服务器的反弹到达正确的位置)。(如果我错了,请纠正我)
如果是这样的话,你应该能够检查你解析的IP是否为OpenDNS的任何IP?没有ping——没有协议(HTTP)级别的东西——只是检查例外情况?
如果您倾向于使用系统管理解决方案而不是编程解决方案,您可以安装一个本地名称服务器,并告诉它不要接受任何东西,只接受仅用于委派区域的NS记录。这是我(我认为互联网上的其他人)上次网络解决方案/Verisign崩溃时使用的修复程序。我在几台本地机器上安装了BIND,告诉我的DHCP服务器将这些地址作为本地名称服务器分发,并为我关心的每个仅委派区域设置如下内容:
zone "com" { type delegation-only; };
zone "net" { type delegation-only; };
仔细想想,我认为在以后的BIND版本中,这可能是默认打开的。作为额外的奖励,你往往会获得比大多数ISP提供的更稳定的DNS解析,你可以控制自己的缓存,进行一些修补,并且不必依赖ISP来修复最新的DNS攻击等。
我喜欢CALM,因为它可以登录到数据库并提供电子邮件通知以及状态面板
你可以在网站上设置一个测试页面,并定期在它上进行GET,以接收"真实"结果(一切正常)或通过电子邮件发送给你的错误消息结果
注意:我是CALM 的作者