ينجح اختبار Ping دائمًا، ولا يمكن بسهولة التحقق من وقت التشغيل باستخدام ping على عنوان url

StackOverflow https://stackoverflow.com/questions/199219

  •  11-07-2019
  •  | 
  •  

سؤال

أشعر بالإحباط بسبب OpenDNS والخدمات الأخرى (على سبيل المثال:roadrunner) الذي يُرجع الآن دائمًا اختبار ping حتى إذا كتبت أي عنوان URL غير صالح، على سبيل المثال:lkjsdaflkjdsjf.com --- لقد قمت بإنشاء برنامج لاستخدامي الخاص من شأنه أن يقوم باختبار اتصال عنوان url للتحقق مما إذا كان الموقع يعمل أم لا.هذا لم يعد يعمل.هل اي منكم لديه اي فكره عن هذا؟

متطلبات:

  1. يجب أن يعمل مع أي موقع ويب صالح، حتى تلك التي لا أتحكم فيها
  2. يجب أن يكون قادرًا على التشغيل من أي شبكة لديها إمكانية الوصول إلى الإنترنت

وسأكون ممتنًا جدًا لسماع كيف يتعامل الآخرون مع هذا الأمر الآن.أود أن أضيف أنني أحاول القيام بذلك باستخدام System.Net في c#

شكرا جزيلا :-)

إضافة جديدة:أبحث عن حل يمكنني من خلاله شراءه وتشغيله على جهاز يعمل بنظام Windows، أو برنامج بلغة C#.:-)

تحديث:

شكرا جزيلا لكم جميعا على إجاباتكم.في النهاية انتهى بي الأمر إلى إنشاء حل عن طريق القيام بذلك:

  1. إنشاء عميل ويب بسيط قام بتنزيل الصفحة المحددة من عنوان url (قد يتغير إلى الرؤوس فقط أو يستخدم هذا للإعلام بتغييرات الصفحة)
  2. اقرأ في ملف xml الذي يسرد ببساطة عنوان URL الكامل للموقع/الصفحات للتحقق منها
  3. تم إنشاء خدمة Windows لاستضافة الحل حتى يتمكن من استعادة عمليات إعادة تشغيل الخادم.
  4. عند حدوث خطأ، يتم إرسال بريد إلكتروني ورسالة نصية إلى قائمة محددة من المستلمين
  5. يتم تعريف معظم القيم (الفاصل الزمني، SMTP، إلى، من، وما إلى ذلك) في ملف .config لسهولة التغيير

وسوف آخذ بعض نصائحك لإضافة "الميزات" إلى هذا لاحقًا، والتي تشمل:

  • صفحة AJAX للمراقبة في الوقت الحقيقي.سأستخدم WCF للاتصال بخدمة Windows الحالية من صفحة asp.net
  • تنزيل الرؤوس فقط (مع خيار مقارنة تغيير الصفحة)
  • جعل أكثر قابلية للتكوين (على سبيل المثال:إعادة المحاولة عند الفشل قبل الإخطار)
هل كانت مفيدة؟

المحلول

يمكنك إنشاء صفحة ويب بسيطة تحتوي على شريط عناوين لموقع الويب وبعض برامج جافا سكريبت التي تستخدم AJAX للوصول إلى موقع ما.إذا حصلت على أي استجابة HTTP بخلاف 200 في رد الاتصال غير المتزامن، فهذا يعني أن الموقع لا يعمل.

<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 ولم أختبره، ولكن من المفترض أن يعطيك فكرة جيدة حقًا.

نصائح أخرى

Wget هو بديل لطيف.لن يتحقق فقط مما إذا كان الجهاز نشطًا، ولكن أيضًا ما إذا كان خادم HTTP يقبل الاتصالات.

لمعرفة ما إذا كانت الخدمة قيد التشغيل، لا ينبغي عليك فقط تنفيذ الأمر ping، ولكن من الجيد أن يكون لديك نصوص برمجية ستصل إلى الخدمة، مثل موقع ويب، وتحصل على استجابة صالحة.لقد استخدمت What's Up Gold في الماضي، بدلاً من كتابة كتابي الخاص.أنا أحب جميع الميزات في المنتجات من هذا القبيل.مثل إرسال صفحة لي عندما تكون الخدمة معطلة.

للعلم، lkjsdaflkjdsjf.com هو اسم مضيف (وهو غير مسجل حاليًا لأي شخص).لا يعمل ping مع عناوين URL، ويعمل ping مع أسماء المضيفين.يتم البحث عن أسماء المضيفين باستخدام نظام اسم المجال.من المفترض أن يفشل DNS عندما لا يتم تسجيل أسماء المضيفين.

المشكلة هي أن بعض الخدمات (على ما يبدو مزود خدمة الإنترنت الخاص بك، وبالتأكيد OpenDNS) لا تفشل في طلبات DNS لأسماء المضيفين غير المسجلة.وبدلاً من ذلك، يقومون بإرجاع عنوان IP الخاص بالمضيف الموجود على شبكتهم والذي يقدم صفحة بحث لأي طلب http.

يبدو أنك تريد معرفة شيئين:هل الاسم حقيقي (أي هل يوجد مضيف بهذا الاسم مسجل على بعض الأجهزة الفعلية)؟وهل هذا الجهاز يعمل؟

إذا كنت تعرف بالفعل أن الاسم المعني حقيقي (على سبيل المثال، تريد معرفة ما إذا كان www.google.com موجودًا)، فيمكنك استخدام ping لأنك تعلم أن الاسم سيتم تحويله إلى عنوان حقيقي (يستطيع مزود خدمة الإنترنت 'لا تُرجع عنوان IP الخاص بهم لاسم مسجل) وستقوم فقط بقياس ما إذا كان هذا الجهاز قيد التشغيل.

إذا كنت لا تعرف ما إذا كان الاسم حقيقيًا أم لا، فستكون المشكلة أصعب لأن مزود خدمة الإنترنت الخاص بك يقوم بإرجاع بيانات خاطئة إلى طلب DNS الخاص بك.الحل الوحيد هنا هو العثور على خادم DNS لن يكذب عليك بشأن الأسماء التي لم يتم حلها.

الطريقة الوحيدة التي يمكنني التفكير فيها للتمييز بين السجلات المزيفة لمزود خدمة الإنترنت لديك والسجلات الحقيقية هي القيام بذلك بحث عكسي على عنوان IP الذي يمكنك الرجوع إليه ومعرفة ما إذا كان عنوان IP هذا موجودًا في شبكة مزود خدمة الإنترنت الخاص بك.المشكلة في هذه الخدعة هي أنه إذا لم يكن لدى مزود خدمة الإنترنت معلومات DNS عكسية لعنوان IP هذا، فلن تعرف ما إذا كان مزود خدمة الإنترنت أو مجرد شخص مغفل لم يقوم بتكوين DNS الخاص به بشكل صحيح (لقد ارتكبت هذا الخطأ كثيرًا مرات في الماضي).

أنا متأكد من أن هناك تقنيات أخرى، ولكن حقيقة أن DNS يقع تحت كل شيء يجعل من الصعب التعامل مع هذه المشكلة.

لا أعرف بشكل مباشر أي خيارات جاهزة في C#، على الرغم من أنني سأكون مندهشًا جدًا إذا لم يكن هناك عدد قليل منها متاح.

لقد كتبت شيئًا مشابهًا منذ بضع سنوات، ولم يعد لدي الرمز لأنه ينتمي إلى شخص آخر، ولكن الفكرة الأساسية كانت استخدام WebClient للوصول إلى الصفحة الافتراضية للمجال، والتحقق من رمز حالة http البالغ 200.

يمكنك بعد ذلك توصيل أي منطق إعلام حول نجاح هذه العملية أو فشلها.

إذا كان عرض النطاق الترددي يمثل مصدر قلق، فيمكنك تقليصه مرة أخرى لاستخدام طلب HEAD فقط.

بالنسبة للمواقع الأكثر تعقيدًا التي تتحكم فيها، يمكنك توصيل صفحة مراقبة الصحة التي تقوم ببعض الاختبارات المتعمقة قبل أن ترسل الاستجابة، على سبيل المثال، اتصال قاعدة البيانات وما إلى ذلك.

غالبًا ما يظل الجهاز الذي لا يعمل على المنفذ 80 يستجيب لأمر ping، لذا فإن اختبار المنفذ 80 (أو أي منفذ آخر تهتم به) سيكون طريقة أكثر موثوقية للبدء.

لقد وجدت أن اختبار ping غير موثوق به على الإطلاق بسبب كل القفزات التي يتعين عليك القفز خلالها، ويمكن دائمًا أن يتدخل شيء ما بينهما.

ربما تكون محاولة فتح اتصال http مع خادم الويب هي أفضل طريقة.

يمكنك محاولة تشغيل "httping" إذا كان لديك cygwin متاحًا أو

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

بقدر ما أستطيع أن أرى، المشكلة هنا هي أن OpenDNS يقوم بحل النطاقات غير الصالحة مرة أخرى إلى نفسها لإعادة توجيهك إلى شيء قريب مما تبحث عنه (لذلك إذا كتبت خطأً في ggooggllee.com، فسينتهي بك الأمر في المكان الصحيح عبر الارتداد من خوادم OpenDNS).(صححوني إذا كنت مخطئا)

إذا كان الأمر كذلك، فيجب أن تكون قادرًا فقط على التحقق مما إذا كان عنوان IP الذي قمت بحله == أي من عناوين IP الخاصة بـ OpenDNS؟لا مزيد من اختبار ping - لا توجد عناصر على مستوى البروتوكول (HTTP) - فقط التحقق من الحالة الاستثنائية؟

إذا كنت تميل نحو حل sys-admin بدلاً من حل البرمجة، فيمكنك تثبيت خادم اسم محلي وإخباره بعدم قبول أي شيء سوى سجلات NS لمناطق التفويض فقط.كان هذا هو الإصلاح الذي استخدمته (وافترضت أن أي شخص آخر على الإنترنت) عندما تعطل Network Solution/Verisign هذه المرة الأخيرة.لقد قمت بتثبيت BIND على جهازين محليين، وطلبت من خوادم DHCP الخاصة بي توزيع هذه الإضافات كخوادم أسماء محلية، وقمت بإعداد شيء مثل ما يلي لكل منطقة من مناطق التفويض التي اهتممت بها فقط:

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

بالتفكير في هذا، أعتقد أنه قد يتم تشغيل هذا افتراضيًا في إصدارات BIND الأحدث.كمكافأة إضافية، فإنك تميل إلى الحصول على دقة DNS أكثر استقرارًا مما يقدمه معظم مزودي خدمة الإنترنت، ويمكنك التحكم في ذاكرة التخزين المؤقت الخاصة بك، والقليل من التصحيح، ولا يتعين عليك الاعتماد على مزود خدمة الإنترنت الخاص بك لإصلاح أحدث هجوم على DNS، وما إلى ذلك.

انا يعجبني هادئ لهذا النوع من الأشياء حيث يقوم بتسجيل الدخول إلى قاعدة بيانات ويوفر إشعارات البريد الإلكتروني بالإضافة إلى لوحة معلومات الحالة

يمكنك إعداد صفحة اختبار على الموقع وإجراء GET عليها بشكل دوري لتلقي إما نتيجة "صحيحة" (كل شيء على ما يرام) أو نتيجة رسالة خطأ يتم إرسالها إليك عبر البريد الإلكتروني

تنبيه قضائي:أنا مؤلف الهدوء

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top