2010-10-04 17 views
6

我有一臺帶有兩個獨立以太網連接的服務器。當我在python中綁定套接字時,它默認爲兩個網絡之一。如何從Python中的第二個網絡中獲取多播流?我曾嘗試使用第二個網絡上的服務器的IP地址來調用綁定,但這種方式沒有奏效。在Python中選擇多播網絡接口

回答

0

我想通了。事實證明,我缺少的部分是將接口添加到用於向多播組添加成員身份的mreq結構中。

1

bind荷蘭國際集團的插座,嘗試值提到here

對於IPv4地址,兩個特殊的形式 被接受,而不是主機 地址:空字符串代表 INADDR_ANY和字符串 ''代表 INADDR_BROADCAST。

INADDR_ANY也被稱爲通配符地址:

與通配本地地址套接字可以接收定向到指定的端口號和消息尋址到任何分配給host`的可能的地址的

更多here

12

我建議你不要使用INADDR_ANY。在生產組播環境中,您希望對組播套接字非常具體,並且不希望執行諸如將igmp連接發送到所有接口之類的事情。當事情不像「route add -host 239.1.1.1 dev eth3」那樣工作時,這會導致黑客工作變通方法,以根據所討論的系統使多播聯接正確進行。使用這個來代替:

def joinMcast(mcast_addr,port,if_ip): 
    """ 
    Returns a live multicast socket 
    mcast_addr is a dotted string format of the multicast group 
    port is an integer of the UDP port you want to receive 
    if_ip is a dotted string format of the interface you will use 
    """ 

    #create a UDP socket 
    mcastsock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 

    #allow other sockets to bind this port too 
    mcastsock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 

    #explicitly join the multicast group on the interface specified 
    mcastsock.setsockopt(socket.SOL_IP,socket.IP_ADD_MEMBERSHIP, 
       socket.inet_aton(mcast_addr)+socket.inet_aton(if_ip)) 

    #finally bind the socket to start getting data into your socket 
    mcastsock.bind((mcast_addr,port)) 

    return mcastsock 

在你還可以用「」代替地址字符串mcastsock.bind,但我反對這項建議。使用'',如果你有另一個使用相同端口的套​​接字,那麼這兩個套接字將獲得其他數據。

+0

是啊你救了我的夜晚的夢想 – waza123 2017-03-29 22:28:34