Frage

Ich bin auf der Suche nach einer Möglichkeit für Kunden in einem LAN ohne Konfiguration alle Instanzen von meiner Server-Anwendung zu finden. Statt selbst etwas hacken, würde Ich mag eine bestehende Lösung verwenden. Ich persönlich brauche es in Python zu tun, aber ich würde glücklich über Lösungen in einer anderen Sprache zu hören.

Also, warum bin ich nicht mit avahi oder OpenSLP oder eine andere Zeroconf / SLP Lösung? Nun, es gibt ein paar zusätzliche Kriterien, und ich habe den Eindruck, keine der oben genannten Systeme passt sie.

Ich bin auf der Suche nach einer Lösung, die:

  • Flexible . Es darf nicht Superuser-Rechte erfordern, das heißt nur Ports> 1024.
  • Solid . Es muss mehrere Dienste des gleichen und unterschiedlichen Diensttyp auf einer einzigen Maschine ermöglichen und weiterhin die Dienste der Werbung, auch wenn die Instanz, die die Anzeige-Server stoppt oder Abstürze gestartet.
  • Mobile . Es muss fast überall, oder zumindest auf * BSD, Debian / gentoo / RedHat / SuSe Linux, Mac OS X, Solaris und Windows NT ausgeführt werden.
  • Licht . Idealerweise würde ein Python-Skript die ganze Lösung. Ich bin nicht im Geringsten daran interessiert, die automatischen Adresskonfiguration oder so ähnlich, obwohl ich begrudgingly eine Lösung akzeptieren würde, dass ich viele Features hat nicht brauchen. Darüber hinaus jede einmalige Einrichtung ist ein streng no-no.

Ich erwarte, dass so etwas wie folgt aus:

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)
War es hilfreich?

Lösung

Ich schrieb eine Anwendung / Bibliothek (derzeit Python und CLI-Schnittstelle), die alle diese critera entspricht. Es heißt minusconf . Es stellte sich heraus Forking nicht einmal notwendig ist.

Andere Tipps

Für Knoten Entdeckung in einem LAN habe ich Verdreht und UDP-Multicast verwendet. Hoffe, es hilft Ihnen auch.

Link zu der verdrehten Dokumentation, die erklären, wie es zu tun: https://twistedmatrix.com/documents/current/core/howto/udp .html # AUTO3

Hier ist eine grundlegende Implementierung eines Server / Client-basierte im Code der verdreht. Es beantwortet sich, wenn Sie einmal laufen, aber alle Prüfcodes und zusätzliche Funktionen wurden entfernt, um es einfacher zu machen zu lesen.

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()

Ich nehme an, Sie Kontrolle über die Client-Anwendungen haben, nicht nur die Server-Anwendung, wobei in diesem Fall Pyro gut funktionieren könnte für Sie.

Flexibel:. verwendet nicht privilegierte Ports

Solid: Es ist seit vielen Jahren gut gepflegt

.

Portable:. reiner Python und auch auf mehreren Plattformen getestet

Licht: Ich denke, Pyro Licht ist für das, was Sie bekommen. Vielleicht Skript fragt nach einer Python ist unrealistisch für einen Netzwerk-Namensdienst?

Auch wenn Sie eigentlich nicht das „Remote-Objekt“ Paradigma des Pyro verwenden mögen, können Sie noch in der Lage sein, nur seinen Namensdienst zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top