用Python订阅UDP多播

用Python订阅UDP多播,python,udp,multicast,Python,Udp,Multicast,这个话题已经被详细讨论过了,不幸的是,我仍然遇到了一些麻烦 我正在尝试从网络上的windows设备订阅运动捕捉数据流。mo cap服务器正在我的网络上广播,我可以用wireshark在我的OS X机器(“目标”)上获取数据。我看到从源ip204.102.224.2(windows)通过UDP在239.255.42.99上广播到端口1511的消息正在根据需要发出 我的python代码如下所示: PORT = 1511 MULTICAST_ADDRESS = '239.255.42.99' SOCK

这个话题已经被详细讨论过了,不幸的是,我仍然遇到了一些麻烦

我正在尝试从网络上的windows设备订阅运动捕捉数据流。mo cap服务器正在我的网络上广播,我可以用wireshark在我的OS X机器(“目标”)上获取数据。我看到从源ip
204.102.224.2
(windows)通过UDP在
239.255.42.99
上广播到端口
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
我认为对于我目前的问题,忽略循环中的一些代码是安全的,因为其中一些代码来自我正在使用的帮助程序库(optrx)。请注意,我并没有一开始就列出所有选项,而是决定将所有选项都包括进来,看看哪些应该保留,哪些可以保留。我试过各种组合和排列。我使用的是OS X 10.10.3

问题在于:

datasock.bind((MULTICAST_ADDRESS, PORT))

您不应该将套接字绑定到多播地址。您应该将其绑定到
'0.0.0.0'
。使用
IP\u ADD\u成员身份的
setsockopt
呼叫负责加入多播组。

那么您的问题是什么或者您的问题在哪里?什么工作,什么不工作?要点是我可以在wire shark的windows机器上看到Mac上的多播,但用这段代码永远无法捕获它。我已经尝试了很多以上选项的组合。谢谢,当我再次在实验室时,我会尝试一下。我会回来报到的。