سؤال

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

بعد الكثير من التفكير والبحث على google وبالطبع SO ، ما زلت لم أجد طريقة جيدة حول كيفية تنفيذ ذلك ، لذلك قررت طرح هذا هنا. تم تنفيذ التطبيق في C # و .NET 4.0 وأنا أبحث عن جميع أشكال الردود - سواء التنفيذ بلغة C # أو لغات أخرى ، أو منطق زائف أو نهج حول كيفية تحقيق - قياس استخدام حركة الإنترنت على جهاز كمبيوتر محلي بدقة كافية.

لتجنب ازدواج الجهود ، حاولت حتى الآن هذه (ولماذا هي غير مناسبة)

  • استخدم WMI للحصول على إحصائيات الشبكة. منذ ذلك الحين تشير معظم منشورات وحلول SO إلى هذا باعتباره النهج ولكنه لا يفي بمتطلباتنا مثل قياس وحدات البايت المرسلة / المستلمة مقابل سعة واجهة الشبكة (على سبيل المثال بطاقة إيثرنت 1 جيجا بايت) للاستخدام سيؤدي إلى قياس جيد لحركة مرور LAN ولكن ليس لحركة مرور الإنترنت (حيث قد يكون النطاق الترددي الفعلي للإنترنت 8 ميجابت في الثانية فقط)
  • استخدام .NET Network Information Statistics أو عداد الأداء - ينتج عنه قراءات مماثلة لما سبق ومن ثم يكون له نفس أوجه القصور
  • استخدم ICMP (Ping) وقم بقياس RTT. تم اقتراح أن 400ms RTT تعتبر مؤشرًا بطيئًا وجيدًا للشبكة المزدحمة ، ومع ذلك قيل لي أن المستخدم لديه مودم (نعم علينا دعم ذلك) ، غالبًا ما يحصل استخدام الوكيل العكسي أو ارتباط الميكروويف على اختبار ping أعلى من ذلك وبالتالي ليس جيدًا قياس
  • ابدأ في تنزيل ملف معروف وقياس السرعة - يؤدي هذا في حد ذاته إلى توليد حركة مرور نحاول تجنبها ، وأيضًا إذا تم إجراء هذا الفحص كثيرًا بشكل كافٍ ، سينتهي تطبيقنا بإنشاء الكثير من حركة المرور على الإنترنت - وهذا ليس مثاليًا مرة أخرى
  • MOD: استخدام BITS - يمكن تعطيل هذه الخدمة على كمبيوتر المستخدم ، وتتطلب تغييرات في سياسة المجموعة وتفترض أن الخادم هو IIS (مع تكوين مخصص) وفي حالتنا ليس خادمنا IIS

لذا ها هي ، أنا مرتبك وأبحث عن بعض النصائح. لقد أبرزت نص السؤال حتى لا تضلوا يا رفاق في قراءة هذا ويتساءلون ما هو السؤال. شكرا.

هل كانت مفيدة؟

المحلول

يمكنك استخدام UPnP للاستعلام عن الموجه واسترجاع عدد البايتات المرسلة والمستلمة عبر الشبكة.يمكنك الاستمرار في التحقق من هذه القيمة على جهاز التوجيه لتحديد النشاط.لسوء الحظ ، لا يبدو أن هذه الوظيفة موثقة جيدًا ، ولكن من الممكن تنفيذ وظيفة اتصال UPnP داخل تطبيق C #.ستحتاج إلى استخدام UDP للاستعلام عن جهاز التوجيه (اكتشاف UPnP) ، وبمجرد العثور على الجهاز ، استعلام عن وظائفه ، ثم الاستعلام عن عدد الحزم المرسلة والمستلمة لجهاز بوابة الإنترنت باستخدام WebClient (TCP).

Genacodicetagpre Genacodicetagpre

نصائح أخرى

هل فكرت في استخدام خدمة النقل الذكي في الخلفية (BITS) .إنه مصمم للقيام بهذه المهمة بالفعل:

تنقل خدمة النقل الذكي في الخلفية (BITS) الملفات (التنزيلات أو التحميلات) بين العميل والخادم وتوفر معلومات التقدم المتعلقة بعمليات النقل.يمكنك أيضًا تنزيل الملفات من نظير.

و ،

حافظ على استجابة تطبيقات الشبكة الأخرى.

لست متأكدًا مما إذا كانت هناك واجهة مُدارة لها (يمكنني رؤية مرجع إلى Powershell Cmdlets) ، لذلك قد يتعين عليك استخدام COM interop لاستخدامها.

بافتراض أنك تستهدف أجهزة كمبيوتر Windows (كما قلت إنك تطور في C #) ، هل نظرت إلى BITS ، خدمة النقل الذكي في الخلفية؟

هناك أمثلة على كيفية ربطه باستخدام C # على MSDN وفي أي مكان آخر ، على سبيل المثال http://msdn.microsoft.com/en-us/magazine/cc188766.aspx

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