簡體   English   中英

用Python訂閱UDP多播

[英]Subscribing to UDP multicast with Python

不幸的是,這個話題在這里已經涵蓋了很多細節,但是我仍然遇到一些麻煩。

我正在嘗試從網絡上的Windows盒中訂閱運動捕捉數據流。 Mo-cap服務器正在通過我的網絡進行廣播,我可以在OS X機器(“目標”)上使用Wireshark獲取數據。 我看到一條消息,該消息起源於通過UDP在239.255.42.99通過UDP廣播到端口1511的源ip 204.102.224.2 (Windows),如所期望的。

我的python代碼如下:

PORT = 1511
MULTICAST_ADDRESS = '239.255.42.99'
SOCKET_BUFSIZE = 1024

datasock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
datasock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
datasock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
datasock.bind((MULTICAST_ADDRESS, PORT))
mreq = struct.pack("=4sl", socket.inet_aton(MULTICAST_ADDRESS), socket.INADDR_ANY)
datasock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32)
datasock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 1)
datasock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, SOCKET_BUFSIZE)
datasock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

while 1:
    data = datasock.recv(rx.MAX_PACKETSIZE)
    packet = rx.unpack(data, version=version)
    if type(packet) is rx.SenderData:
        version = packet.natnet_version
        #print("NatNet version received:", version)
    if type(packet) in [rx.SenderData, rx.ModelDefs, rx.FrameOfData]:
        packet_dict = packet._asdict()
        all_bodies = packet_dict['rigid_bodies']
        for body in all_bodies:
            contortion = body._asdict()['orientation']
            euler = Quat([elem for elem in contortion]).equatorial

我認為對於我當前的問題,可以安全地忽略循環中的某些代碼,因為其中一些代碼是從我正在使用的助手庫(optirx)派生的。 請注意,我並不是從所有選項入手,而是決定將所有選項都包括在內,以查看應該保留的內容和可以保留的內容。 我嘗試了各種組合和排列。 我在OS X 10.10.3上

問題在這里:

datasock.bind((MULTICAST_ADDRESS, PORT))

您不應將套接字綁定到多播地址。 您應該將其綁定到'0.0.0.0' 使用IP_ADD_MEMBERSHIPsetsockopt調用負責加入多播組。

暫無
暫無

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

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