Ping总是成功,不能使用网址上的ping轻松检查正常运行时间

时间:2008-10-13 22:18:48

标签: c# .net ping system.net

我因为OpenDNS和其他服务(即:roadrunner)而感到沮丧,即使你输入任何无效的网址,现在也总是返回ping,即:lkjsdaflkjdsjf.com ---我创建了自己使用的软件url验证网站是否已启动。这不再有效。有没有人对此有任何想法?

要求:

  1. 它应该适用于任何有效的网站,即使是我无法控制的网站
  2. 它应该能够从任何具有互联网访问权限的网络运行
  3. 我非常感谢听到别人现在如何处理这件事。我想补充一下,我试图在c#

    中使用System.Net来做这件事

    非常感谢你: - )

    新增功能:寻找一种解决方案,我可以在我的Windows机器上购买和运行,也可以在c#中编程。 : - )

    更新

    非常感谢你的回答。最终,我最终通过这样做创建了一个解决方案:

    1. 创建一个简单的webclient,从url下载指定的页面(可能只更改为标题或使用它来通知页面更改)
    2. 读入xml文件,该文件只列出要检查的网站/页面的完整网址
    3. 创建了一个Windows服务来托管解决方案,以便恢复服务器重启。
    4. 发生错误时,会向定义的收件人列表发送电子邮件和短信
    5. 大多数值(interval,smtp,to,from等)都在.config中定义,以便于更改
    6. 我将采取一些建议,稍后再添加“功能”,其中包括:

      • 用于实时监控的AJAX页面。我将使用WCF从asp.net页面
      • 连接到现有的Windows服务
      • 仅下载标题(包含页面更改比较选项)
      • 使更多可配置(即:在通知之前重试失败)

10 个答案:

答案 0 :(得分:4)

Wget是个不错的选择。它不仅会检查机器是否处于活动状态,还会检查HTTP服务器是否正在接受连接。

答案 1 :(得分:2)

要查看服务是否已启动,您不仅应该ping通,还可以使用可以访问服务的脚本(例如网站),并获得有效的响应。我过去曾经使用过What's Up Gold,而不是自己编写。我喜欢这类产品的所有功能。例如,当服务停止时向我发送页面。

答案 2 :(得分:2)

您可以创建一个简单的网页,其中包含网站的地址栏和一些使用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,我还没有测试过,但它应该给你一个非常好的主意。

答案 3 :(得分:1)

对于记录,lkjsdaflkjdsjf.com是主机名(目前尚未向任何人注册)。 ping不适用于URL,ping适用于主机名。使用Domain Name System查找主机名。当主机名未注册时,DNS应该会失败。

问题是某些服务(显然是您的ISP,绝对是OpenDNS)不会对未注册的主机名的DNS请求失败。相反,他们返回其网络上的主机的IP地址,该主机将搜索页面呈现给任何http请求。

您似乎想知道两件事:名称是否真实(也就是说,某个实际机器上是否注册了此名称的主机)?那机器运转了吗?

如果您已经知道相关名称是真实的(例如,您想知道www.google.com是否已启动),那么您可以使用ping,因为您知道该名称将解析为真实地址( ISP无法返回其注册名称的IP),您只能测量该机器是否在运行。

如果您不知道该名称是否真实,那么问题就更难了,因为您的ISP正在向您的DNS请求返回虚假数据。这里唯一的解决方案是找到一个DNS服务器,它不会欺骗你有关未解析的名称。

我能想到区分您的ISP虚假记录和真实记录的唯一方法是在您获得的IP上进行reverse lookup,看看该IP是否在您的ISP网络中。这个技巧的问题在于,如果ISP没有针对该IP的反向DNS信息,您将无法知道它是ISP还是仅仅是一些没有正确配置其DNS的傻瓜(我犯了很多错误)过去的几次)。

我确信还有其他技术,但DNS存在于一切之下这一事实使得很难处理这个问题。

答案 4 :(得分:1)

不要直接知道c#中的任何现成选项,但如果没有少数可用,我会非常惊讶。

几年前我写了类似的东西,不再有代码了,因为它属于别人,但基本的想法是使用WebClient来点击域默认页面,并检查http状态代码为200 。

然后,您可以围绕此操作的成功或失败连接任何通知逻辑。

如果考虑带宽,您可以将其修剪回使用HEAD请求。

对于您控制的更复杂的站点,您可以连接一个运行状况监视页面,该页面在发送响应之前进行更深入的测试,例如DB连接等。

通常,端口80上的死机仍会响应ping,因此测试端口80(或您感兴趣的其他任何端口)将是一种更可靠的方式。

答案 5 :(得分:0)

我发现ping是非常不可靠的,因为你必须跳过所有的跳跃,而且介于两者之间的东西总是会干扰。

尝试打开与Web服务器的http连接可能是最好的方法。

答案 6 :(得分:0)

如果您有可用的cygwin或

,您可以尝试运行'httping'

http://freshmeat.net/projects/httping/

答案 7 :(得分:0)

据我所知,这里的问题是OpenDNS将无效域解析回自己,以便将您转发到接近您所追求的东西(所以如果你错误ggooggllee.com,你最终会在正确的地方通过从OpenDNS服务器反弹)。 (如果我错了,请纠正我)

如果是这种情况,您应该只能检查您已解决的IP == OpenDNS的任何IP?没有更多的ping - 没有协议(HTTP)级别的东西 - 只是检查异常情况?

答案 8 :(得分:0)

如果您倾向于使用sys-admin解决方案而不是编程解决方案,则可以安装本地名称服务器,并告诉它除了仅限委派区域的NS记录外,不接受任何内容。这是网络解决方案/ Verisign最后一次破解时使用的修复我(我假设互联网上的其他所有人)。我在几台本地计算机上安装了BIND,告诉我的DHCP服务器将这些地址作为本地名称服务器分发,并为我所关注的每个仅限授权区域设置如下内容:

zone "com" { type delegation-only; };
zone "net" { type delegation-only; };

考虑到这一点,我认为这可能会在以后的BIND版本中默认打开。作为一个额外的奖励,你倾向于获得比大多数ISP提供的更稳定的DNS解析,你可以控制自己的缓存,一点点修补,你不必依赖你的ISP来修复最新的DNS攻击等。

答案 9 :(得分:0)

我喜欢CALM这类事情,因为它记录到数据库并提供电子邮件通知以及状态仪表板

您可以在网站上设置测试页并定期对其进行GET以接收“真实”结果(一切正常)或通过电子邮件发送给您的错误消息结果

警告:我是CALM的作者