簡體   English   中英

Python扭曲的框架多播綁定在特定的接口上

[英]Python twisted framework multicast bind on specific interface

在google上搜索高低之后我還沒有找到以下問題的明確答案:大致遵循以下指南: http//twistedmatrix.com/documents/10.2.0/core/howto/udp.html#auto3

如何將雙絞線多播偵聽器綁定到多播地址以及特定或所有接口上。

在查看reactor.listenMulticast時,它不為硬件接口提供抽象,只提供由IP地址表示的偽接口。 我找不到只綁定多播地址的方法,例如特定接口或所有接口的224.0.0.1。 任何人都可以提供更多相關信息嗎?

其他答案可以解決問題,但是在多個接口上監聽多播組的方式有“更加扭曲”(並且可能更容易)。

在一個或多個接口上偵聽多播組

要在一個或多個接口上偵聽多播組,請在協議的transport.joinGroup()方法的多次調用中提供每個所需接口的IP作為“接口”參數。

下面是一個適用於我的Linux機器的示例,它將使您的系統在特定接口上偵聽多播。 將IP地址替換為屬於您系統的IP地址。

#!/usr/bin/env python

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

class MyProtocol(protocol.DatagramProtocol):
    def startProtocol(self):
        # Join a multicast group, 224.0.0.9, on the interface belonging
        # to each of these IPs.
        # XXX Replace the interface_ips with one or more IP addresses belonging
        # to your system.
        for interface_ip in ["192.168.2.2", "10.99.1.100"]:
            self.transport.joinGroup("224.0.0.9", interface_ip)

if __name__ == "__main__":
    reactor.listenMulticast(1520, MyProtocol())
    reactor.run()

您可以使用/sbin/ip maddr show命令檢查接口是否正在偵聽新的多播組。 在命令輸出中找到所需的接口名稱,並驗證多播組是否顯示在其下方。

原始帖子中鏈接的UDP服務器示例應該能夠通過更改對joinGroup()的調用來包含第二個IP地址參數來執行相同的操作,如上所述。

從特定IP發送多播

如果您正在接收套接字上的組播數據,那么您可能也希望發送多播數據 - 可能是多個接口。 由於它密切相關,並且我將把它放在這里的例子很少。 在twisted.internet.protocol.DatagramProtocol對象中,您可以使用self.transport.setOutgoingInterface()方法來控制將用於后續調用self.transport.write()的源IP。 顯示從多個IP /接口發送消息的示例:

class MyProtocol(protocol.DatagramProtocol):
    # ...
    def send_stuff(self, msg):
        for src_ip in ["10.0.0.1", "192.168.1.1"]:
            self.transport.setOutgoingInterface(src_ip)
            self.transport.write(msg, ("224.0.0.9", 1520))

假設這些IP分配給兩個不同的接口。 使用Wireshark嗅探您會看到從第一個接口發出的消息,然后是第二個接口,使用每個IP作為相應傳輸的源IP地址。

reactor.listenMulticast返回twisted.internet.udp.MulticastPort對象。 該對象擁有您正在偵聽的套接字。 因此,請繼續查看reactor.listenMulticast的結果,並設置相應的套接字選項(在本例中,它看起來像SO.BINDTODEVICE)以及一個以null結尾的設備字符串。

import IN, socket, struct

udp_port = reactor.listenMulticast(8005, MulticastServerUDP())
dev = "eth0" + "\0"
udp_port.socket.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, dev)
reactor.run()

如果直接通過listenMulticast調用公開它會很好,但假設這有效,那將是一個非常簡單的補丁。 如果這可以解決您的問題,請告訴我。

一個簡單的,如果重手的方法可以通過以下方式指定路線:

sudo route add 239.255.0.0 -interface en0 -netmask 255.255.0.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM