الطريقة الصحيحة للتمييز بين الخدمات المتعددة باستخدام ZeroConf

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

  •  22-12-2019
  •  | 
  •  

سؤال

أنا أكتب برنامجًا سيتم تشغيله على أجهزة الكمبيوتر والهواتف أيضًا.

تستخدم الخدمة واجهة برمجة تطبيقات HTTP للاتصال وسيتم نشرها عبر الشبكة المحلية باستخدام Zeroconf.

في البداية قمت بنشر خدمتي باستخدام _http._tcp. كنوع الخدمة ولكني اكتشفت بسرعة أن كلاً من NAS وجهاز استقبال الموسيقى الخاص بي (!) يبثان نفسيهما أيضًا مع نوع الخدمة المحدد هذا.

لذا فإن السؤال الذي يطرح نفسه الآن هو كيفية التمييز بين خدمتي والخدمات الأخرى التي تستخدم HTTP.

البدائل

استخدام نوع خدمة مختلف

من المؤكد أن هذه هي الطريقة الأسهل بالتأكيد وتضمن (تقريبًا) عدم التقاط أي خدمات أخرى.

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

باستخدام سجل TXT

تفاحة2 يصف سجل TXT مثل هذا:

عند تسجيل خدمة ما، يتم إنشاء ثلاثة سجلات DNS ذات صلة:سجل خدمة (SRV)، وسجل مؤشر (PTR)، وسجل نصي (TXT).يحتوي سجل TXT على بيانات إضافية مطلوبة لحل الخدمة أو استخدامها، على الرغم من أنها غالبًا ما تكون فارغة أيضًا.

يبدو الأمر بالتأكيد وكأنه الطريقة الصحيحة للقيام بذلك، لكنني ما زلت غير متأكد ومن الصعب العثور على وصف لما يجب أن يحتويه الحقل.

أول شيء على الرغم من ذلك هو وضع شيء مثل <service_name>-<version> والتي سيتم تحليلها بعد ذلك لمعرفة الخدمة الفعلية.

يبدو أن NAS الخاص بي يستخدم هذا لتحديد أرقام الطراز والإصدار.

حاول التحدث إلى الخدمة

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

يبدو هذا وكأنه نهج بطيء إلى حد ما ومن يعرف ما الذي يصنع HEAD الطلب إلى جهاز الاستقبال الخاص بي سوف يفعل.


وللتوضيح فقط، هذا السؤال لا علاقة له بلغة أو إطار عمل معين، بل يتعلق بمفاهيم ZeroConf.

يمكنني عرض بعض التعليمات البرمجية ولكني لا أرى كيف سيساعد ذلك.

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

المحلول

أولاً، هل الخدمة التي تعلن عنها تستوفي بالفعل المؤهلات المطلوبة؟ _http كما حددها آر إف سي 2782.على وجه التحديد - هل لا يقتصر الأمر على استخدام HTTP للنقل فحسب، بل هو أيضًا:

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

إذا كانت الإجابة لا، فقم بتسجيل نوع الخدمة الخاص بك (هناك بعض الخدمات الأخرى التي تستخدم HTTP كوسيلة نقل ولكنها لا تستوفي هذه المؤهلات لذلك لديهم -http كلاحقة لاسم الخدمة، انظر pgpkey-http, senteo-http, xul-http).

إذا كانت الإجابة بنعم، فهناك طريقتان يمكن اتباعهما اعتمادًا على مدى صرامة تفسير الشخص لـ RFC.الأقل صرامة هو مجرد إضافة أ رسالة قصيرة سجل كما أشرت بالفعل في سؤالك.يسجل iTunes نفسه بـ رسالة قصيرة سجل في الشكل iTSh Version=196618.

إذا كنت تشعر بمزيد من الصرامة، فإن RFC ينص صراحةً فقط على أن u=, p= و path= توجد سجلات TXT لـ HTTP.ربما يمكن لأي شخص أن يشارك في هذا الأمر، لكنني لم أر الكثير من النقاش حول ما إذا كانت إضافة سجلات TXT إلى الإدخالات الموجودة بالفعل أمرًا مستهجنًا أم لا.لذلك، الطريقة الأخرى هي مجرد اسم مثيل خوارزمي.على سبيل المثال، إضافة اللاحقة "-NicklasAService" إلى اسم الجهاز.نأمل أن نمنحها اسمًا فريدًا للشبكة المحلية مع الاستمرار في جعلها بحيث يمكن انتقاء الخدمة بسهولة من خلال سجل PTR بمجرد البحث عن اللاحقة.

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