柔軟性、固体、携帯サービス発見
-
05-09-2019 - |
質問
いなければならないというお客様LANのすべてのインスタンスのサーバアプリケーションな設定をします。の代わりにハッキングも自分自身をお使いの既存の解決策です。個人的については親権者の方の同意が必要でとなるよう設計されていPythonが、今後は楽しいソリューションその他の言語です。
なぜ私を使用しない avahi または OpenSLP その他の Zeroconf/SLP 解決するのかでもカップルの基準に照らし、私の印象では、上記のシステムマッチします。
を探していソリューション:
- 柔軟な.すなsuperuser権利、すなわち専用のポート>1024.
- 固体.こ複数のサービスと同じ、異なるサービス/タイプシングルマシンの継続広告サービスの場合でも、インスタンスを開始した広告サーバーを停止したがクラッシュします。
- 携帯.でほともに、少なくとも*BSD、Debian/ジェンツーペンギン/RedHat/SuSe Linux、Mac OS X,Solaris,Windows NT.
- 光.理想的には、Pythonスクリプトの全体ます。私は、少なくとも興味の住所autoconfigurationいのも長いのもどっちも似合いがいbegrudgingly受け入れを解決するもののほか必要です。また、一セットアップは厳しい。
期待していて思ったこと。
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)
解決
私は、これらすべてのcriteraにマッチしたアプリケーション/ライブラリ(現在はPythonとCLIインターフェイス)を書きました。これは minusconf に呼ばれています。フォークも必要ありませんが判明します。
他のヒント
LAN内のノードの発見のために私はツイストとUDPマルチキャストを使用しました。それはあまりにもあなたのお役に立てば幸いです。
それを行う方法を説明しツイストドキュメントへのリンク: https://twistedmatrix.com/documents/current/core/howto/udp .htmlを#auto3する
ここでのねじれたコードに基づいて、サーバ/クライアントの基本的な実装です。 それはあなたが一度実行した場合、それ自体に答えるが、すべてのチェックコードと余分な機能は、それが単純に読むようにするために削除されました。
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などの試験をマルチプラットフォームで
光: と思い乾式再光用いしているのかもしれませんもう一つのPythonスクリプトが非現実的なネットワークネームサービス?
もやしたくない場合なお、実際に動作させるためには、"リモートオブジェクト"のパラダイムの乾式再だができるのもそのネーミングサービスです。