كيف يمكنك اكتشاف اتصالات الإنترنت الهاتفية أو النطاق العريض أو اللاسلكية في C++ لنظام التشغيل Windows؟

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

  •  01-07-2019
  •  | 
  •  

سؤال

لدي برنامج تثبيت (مجرد برنامج C++ MFC عادي، وليس مستندًا إلى Windows Installer) يحتاج إلى تعيين بعض قيم التسجيل بناءً على نوع الاتصال بالإنترنت:النطاق العريض و/أو الطلب الهاتفي و/أو اللاسلكي.في الوقت الحالي يتم تحديد هذه المعلومات من خلال طرح سلسلة من الأسئلة بنعم أو لا.تكمن المشكلة في أن الشخص الذي يقوم بالتثبيتات ليس هو نفس الشخص الذي يمتلك الكمبيوتر ويستخدمه، لذا فهم ليسوا متأكدين دائمًا من الإجابات التي يجب أن تكون على هذه الأسئلة.هل هناك طريقة لتحديد أي من هذه المعلومات برمجياً؟تمت كتابة التعليمات البرمجية بلغة C++ (وMFC اختياريًا) لنظام التشغيل Windows XP والإصدارات الأحدث.الحلول المستندة إلى .NET ليست خيارًا لأنني لا أريد أن أضطر إلى تحديد ما إذا كان إطار العمل مثبتًا قبل تشغيل برنامج التثبيت الخاص بنا.

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

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

المحلول

استخدم InternetGetConnectedState API لاسترداد حالة الاتصال بالإنترنت.

لقد اختبرت ذلك ويعمل بشكل جيد.

لقد وجدت هذه الوثيقة التي يمكن أن تساعد:

http://www.pcausa.com/resources/InetActive.txt

نصائح أخرى

[ليس لدي أي فكرة عن كيفية الحصول على المعلومات التي طلبتها بالضبط، ولكن...] ربما يمكنك إعادة صياغة (لنفسك) ما تحاول تحقيقه؟مثلًا، بدلاً من السؤال "هل لدى المستخدم نطاق عريض أو اتصال هاتفي"، اسأل "ما مقدار النطاق الترددي الذي يتمتع به اتصال المستخدم بالإنترنت" - وبعد ذلك يمكنك محاولة الإجابة على السؤال المعاد صياغته دون أي إدخال من المستخدم (مثل قياس النطاق الترددي).

بالمناسبة.إذا طلبت من المستخدم فقط "النطاق العريض أو الطلب الهاتفي"، فقد تواجه بعض المشكلات:

  • ماذا لو كان لدى المستخدم نوع اتصال لم تتوقعه؟
  • ماذا لو كان المستخدم لا يعرف (لأن هناك فقط كابل إيثرنت ينتقل إلى مودم/جهاز توجيه PPPoE DSL)؟
  • ماذا لو كان المستخدم متصلاً من خلال سلسلة من الاتصالات (VPN عبر الطلب الهاتفي، إلى شبكة أخرى ذات نطاق عريض؟)

قد يكون السؤال عن "القدرات" بدلاً من "النوع" أكثر فائدة في تلك الحالات.

بخصوص سؤال "هل الاتصال بالإنترنت دائم أم لا؟":

  • ربما تكون أفضل طريقة هي جعل التطبيق قويًا بدرجة كافية دائماً التعامل مع اتصال غير دائم :-) والذي من شأنه أن يعمل بنفس الطريقة مع الطلب الهاتفي والنطاق العريض ...
  • وبدلاً من ذلك، ربما يمكنك معرفة المدة التي تم خلالها إنشاء اتصال الإنترنت للمستخدم بالفعل، ومقارنته بوقت تشغيل النظام؟إذا كان الاتصال متصلاً بالإنترنت طوال فترة تشغيل الكمبيوتر تقريبًا، فمن المحتمل أن يكون اتصالًا دائمًا.

على أية حال، من المحتمل أن تفشل هذه الاستدلالات مع أنواع الاتصال الغامضة.

أيضًا فيما يتعلق بنقطة عدم إرسال الكثير من البيانات:إذا كان لدى الأشخاص تعريفة "النطاق العريض + الحد المنخفض لحركة المرور"، فلا يجب عليك إرسال الكثير من البيانات أيضًا حتى لو كان النطاق الترددي يسمح :-)

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

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

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

وأنا أتفق مع أوليفر، كما تلمح:لديك بالفعل وظيفة للتعامل مع فقدان الاتصال، فلماذا لا تقوم بتمكينها افتراضيًا.

يمكن أن تتعطل اتصالات النطاق العريض بسبب:برنامج جهاز التوجيه الذي يتجمد (يحدث كثيرًا بالنسبة لي)، أو محول الطاقة الذي يتجمد، ...

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