5

LAN 内のクライアントが構成なしでサーバー アプリケーションのすべてのインスタンスを検索する方法を探しています。自分で何かをハッキングする代わりに、既存のソリューションを使用したいと考えています。個人的には、Python で行う必要がありますが、他の言語での解決策について聞いてうれしいです。

では、なぜavahiOpenSLPなどのZeroconf / SLPソリューションを使用しないのでしょうか? 追加の基準がいくつかありますが、前述のシステムのいずれもそれらに一致しないという印象を受けました。

私は次のような解決策を探しています:

  • フレキシブル。スーパーユーザー権限を必要としないでください。つまり、1024 を超えるポートのみを使用してください。
  • 固体。1 台のマシンで同じサービス タイプと異なるサービス タイプの複数のサービスを許可し、アドバタイズ サーバーを開始したインスタンスが停止またはクラッシュした場合でも、サービスのアドバタイジングを継続する必要があります。
  • ポータブル。ほぼどこでも、または少なくとも *BSD、Debian/gentoo/RedHat/SuSe Linux、Mac OS X、Solaris、および Windows NT で実行する必要があります。
  • 。理想的には、1 つの Python スクリプトがソリューション全体になります。アドレスの自動構成などにはまったく興味がありませんが、必要のない機能がたくさんあるソリューションをしぶしぶ受け入れます。さらに、1 回限りのセットアップは厳禁です。

私は次のようなものを期待しています:

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

3 に答える 3

3

これらすべての条件に一致するアプリケーション/ライブラリ (現在は Python および CLI インターフェイス) を作成しました。それはMinusconfと呼ばれます。分岐する必要さえないことがわかりました。

于 2009-03-17T18:09:38.947 に答える
2

LAN でのノード検出には、Twisted と UDP マルチキャストを使用しました。それがあなたにも役立つことを願っています。

その方法を説明するねじれたドキュメントへのリンク: https://twistedmatrix.com/documents/current/core/howto/udp.html#auto3

以下は、Twisted のコードに基づくサーバー/クライアントの基本的な実装です。1 回実行すると自動的に応答しますが、読みやすくするためにすべてのチェック コードと追加機能が削除されています。

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()
于 2013-08-13T16:02:32.343 に答える
1

サーバーアプリだけでなく、クライアントアプリも制御できると思います。その場合、Pyroがうまく機能する可能性があります。

柔軟:非特権ポートを使用します。

堅実:長年にわたり良好に維持されています。

ポータブル:純粋な Python であり、複数のプラットフォームで十分にテストされています。

ライト:パイロはあなたが得ているものに対して軽いと思います. 1 つの Python スクリプトを要求することは、ネットワーク ネーム サービスにとって非現実的ではないでしょうか?

Pyro の「リモート オブジェクト」パラダイムを実際に使用したくない場合でも、そのネーミング サービスだけを使用できる場合があります。

于 2009-02-20T06:43:55.700 に答える