0

ツイストPythonのマルチキャストプロトコルを試しています。これは簡単な例です。

以下のように224.0.0.1と224.0.0.2をリッスンする2つのサーバーを作成しました。

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

class MulticastServerUDP(DatagramProtocol):
    def __init__ (self, group, name):
        self.group = group
        self.name = name
    def startProtocol(self):
        print '%s Started Listening' % self.group
        # Join a specific multicast group, which is the IP we will respond to
        self.transport.joinGroup(self.group)

    def datagramReceived(self, datagram, address):
        print "%s Received:"%self.name + repr(datagram) + repr(address)


reactor.listenMulticast(10222, MulticastServerUDP('224.0.0.1', 'SERVER1'), listenMultiple = True)
reactor.listenMulticast(10222, MulticastServerUDP('224.0.0.1', 'SERVER2'), listenMultiple = True)

reactor.run()

次に、このコードを実行して「HELLO」を送信します。

import socket

MCAST_GRP = '224.0.0.1'
MCAST_PORT = 10222

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
sock.sendto("HELLO", (MCAST_GRP, MCAST_PORT))

結果はかなり紛らわしいものでした。いくつかのケースがあります:

-すべてのグループIPとMCAST_GRPを224.0.0.1に設定すると、両方のサーバーがメッセージを受信しました(予想)-両方のサーバーのグループIPを224.0.0.1に設定し、送信スクリプトでMCAST_GRPを224.0.0.2(または224.0.0.1)、両方のサーバーがメッセージを受信しませんでした(予想)

-一方のサーバーのグループIPを224.0.0.1に設定し、もう一方のサーバーのグループIPを224.0.0.2に設定すると、奇妙なことが起こります。MCAST_GRPを224.0.0.1または224.0.0.2に設定すると、2つのサーバーのうち1つだけがメッセージを受信することを期待していました。その結果、両方のサーバーがメッセージを受信しました。何が起こっているのかわかりません。誰かがこれを説明できますか?

注:これらを同じマシンで実行しています。

SL

4

2 に答える 2

2

確かに、少し注意が必要です。あなたはそれをこのように書かなければなりません:

reactor.listenMulticast(
    10222, 
    MulticastServerUDP('224.0.0.1', 'SERVER1'),
    listenMultiple=True,
    interface='224.0.0.1'
)

reactor.listenMulticast(
    10222, 
    MulticastServerUDP('224.0.0.2', 'SERVER2'),
    listenMultiple=True,
    interface='224.0.0.2'
)

以前も同じ問題がありました。私はそれを見つけるためにソースを調べなければなりませんでした。しかし、Cでのネットワークプログラミングのバックグラウンドのために、私はそれを解決しました。

于 2012-07-31T09:52:24.860 に答える
1

マルチキャストは奇抜であり、マルチキャストのプラットフォーム(Linux、Windows、OS Xなど)の実装はさらに奇抜です。

Twistedは、ここでのプラットフォームのマルチキャスト動作を反映しているだけなので、これは漠然とTwisted関連の質問にすぎません。本当に、それはマルチキャストの質問とプラットフォームの質問です。

何が起こっているのかについて、少し知識に基づいた推測があります。

マルチキャストは、ホストにアドレスをサブスクライブさせることで機能します。ホストで実行されているプログラムがグループに参加すると(例:224.0.0.1)、ホストはこれをローカルで記録し、ネットワーク操作(IGMP)を実行して、近くのホストに通知します(おそらくルーター経由ですが、あいまいです。この部分の詳細)現在、そのグループのメッセージに関心があること。

マルチキャストの作成者の理想的な世界では、そのサブスクリプションはインターネット全体に伝播します。これは、インターネット上のどこにいてもそのグループにメッセージを送信するときはいつでも、どのルーターがそのグループにメッセージを送信しても、そのグループにサブスクライブしているすべてのホストにメッセージを配信できるようにするために必要です。サブスクライブしたホストのみがメッセージを配信する必要があるため、これはブロードキャストよりも効率的であると考えられます。ルーターはサブスクリプションを追跡しているため、サブスクライブされたホストがないリンクへのトラフィックの送信をスキップできます。

現実の世界では、マルチキャストサブスクリプションは通常、それほど遠くまでは伝播されません(たとえば、最初のルーター、おそらく家のLANを実行しているルーターに到達し、そこで停止します)。

したがって、理想的な宇宙に関するすべての情報は、このシナリオとは無関係に見えるかもしれません。でも!私の疑惑は、マルチキャストを実装しているほとんどの人が、その最初の部分について本当に、本当に真剣に考えており、マルチキャストの実装が完了するまでにかなり疲れていたということです。

マルチキャストグループのメッセージが実際にホストに到達すると、ホストは実際にそれに関心のあるプログラムにメッセージを配信する必要があります。ここで、私は、実装者が疲れすぎて正しいことをすることができなかったのではないかと思います。代わりに、彼らはさまざまな怠惰で簡単なことをしました(プラットフォームによって異なります)。たとえば、一部のユーザーは、マルチキャストグループにサブスクライブされているシステム上の開いているすべてのソケットにアクセスし、メッセージを配信しました。

他のプラットフォームでは、単一のマルチキャストメッセージが単一のリスニングマルチキャストソケットに複数回配信される場合があります。そしてもちろん、マルチキャストメッセージがまったく配信されないという一般的な問題があります。

マルチキャストランドで奇抜な時間をお楽しみください!

于 2012-07-28T10:56:41.650 に答える