我已经详细介绍了这个主题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
答案 0 :(得分:1)
问题在于:
datasock.bind((MULTICAST_ADDRESS, PORT))
您不应该将套接字绑定到多播地址。您应该将其绑定到'0.0.0.0'
。 setsockopt
与IP_ADD_MEMBERSHIP
的呼叫负责加入多播组。