سؤال

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

فلماذا أنا لا أستخدم افاهي أو openslp. أو البعض الآخر Zeroconf./SLP المحلول؟ حسنا، هناك بضعة معايير إضافية، وأنا تحت انطباع لا يطابقها أي من النظم المذكورة أعلاه.

أنا أبحث عن حل هو:

  • مرن. وبعد يجب ألا تتطلب حقوقا خارقا، أي استخدام المنافذ> 1024 فقط.
  • صلب. وبعد يجب أن تسمح خدمات متعددة من نفس النوع والخدمة المختلفة على جهاز واحد وتستمر في الإعلان عن الخدمات حتى عندما تتوقف المثيل الذي بدأ خادم الإعلان أو تعطله.
  • المحمولة. وبعد يجب أن تعمل تقريبا في كل مكان تقريبا، أو على الأقل على * BSD، Debian / Gentoo / Redhat / Suse Linux، Mac OS X، Solaris و Windows NT.
  • خفيفة. وبعد من الناحية المثالية، سيكون البرنامج النصي Python هو الحل بأكمله. أنا لست على الأقل مهتمة بمعالجة التلقائي أو شيء من هذا القبيل، على الرغم من أنني سأقبل الحل الذي يحتوي على الكثير من الميزات التي لا أحتاج إليها. علاوة على ذلك، فإن أي برنامج إعداد لمرة واحدة غير لا لا.

أتوقع شيئا مثل هذا:

def registerService(service): # (type, port)
    if listen(multicast, someport):
        if fork() == child:
            services = [service]
            for q in queriesToMe():
                if q == DISCOVERY:
                    answer(filter(q.criteria, services))
                elif q == ADVERTISE and q.sender == "localhost":
                    services.append(q.service)
    else:
        advertiseAt("localhost", service)
هل كانت مفيدة؟

المحلول

كتبت تطبيقا / مكتبة (حاليا بايثون واجهة CLI) التي تتطابق مع كل هذه المعايير. تسمى minusconf.. وبعد اتضح أن الشوكة ليست ضرورية حتى.

نصائح أخرى

لاستكشاف العقدة في LAN استخدمت ملتوية و UDP المتعددة. امل ان اساعدك ايضا.

رابط للوثائق الملتوية التي تشرح كيفية القيام بذلك:https://twistedmatrix.com/documents/current/core/howto/udp.html#euto3.

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

from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor

class MulticastPingPong(DatagramProtocol):
    MULTICAST_ADDR = ('228.0.0.5', 8005)
    CMD_PING = "PING"
    CMD_PONG = "PONG"

    def startProtocol(self):
        """
        Called after protocol has started listening.
        """
        # Set the TTL>1 so multicast will cross router hops:
        self.transport.setTTL(5)
        # Join a specific multicast group:
        self.transport.joinGroup(self.MULTICAST_ADDR[0])

        self.send_alive()

    def send_alive(self):
        """
        Sends a multicast signal asking for clients.
        The receivers will reply if they want to be found.
        """
        self.transport.write(self.CMD_PING, self.MULTICAST_ADDR)

    def datagramReceived(self, datagram, address):
        print "Datagram %s received from %s" % (repr(datagram), repr(address))

        if datagram.startswith(self.CMD_PING):
            # someone publishes itself, we reply that we are here
            self.transport.write(self.CMD_PONG, address)
        elif datagram.startswith(self.CMD_PONG):
            # someone reply to our publish message
            print "Got client: ", address[0], address[1]


if __name__ == '__main__':
    reactor.listenMulticast(8005, MulticastPingPong(), listenMultiple=True)
    reactor.run()

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

مرن: يستخدم المنافذ غير المميزة.

صلب: لقد تم الحفاظ عليه جيدا لسنوات عديدة.

المحمولة: بيثون نقي واختباره جيدا على منصات متعددة.

خفيفة: أعتقد أن بيرو خفيف لما تحصل عليه. ربما يسأل عن برنامج نصي Python واحد غير واقعي لخدمة تسمية الشبكة؟

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

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