使用Python订阅UDP多播

时间:2015-09-04 08:33:42

标签: python udp multicast

我已经详细介绍了这个主题here,不幸的是,我仍然遇到了一些麻烦。

我正在尝试从网络上的Windows框中订阅动作捕捉数据流。 mo-cap服务器通过我的网络进行广播,我可以在OS X机器(“目标”)上使用wireshark获取数据。我发现,根据需要,来自204.102.224.2通过UDP广播到端口239.255.42.99的原始IP 1511(窗口)的消息正在输出。

我的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

1 个答案:

答案 0 :(得分:1)

问题在于:

datasock.bind((MULTICAST_ADDRESS, PORT))

您不应该将套接字绑定到多播地址。您应该将其绑定到'0.0.0.0'setsockoptIP_ADD_MEMBERSHIP的呼叫负责加入多播组。