here已经详细介绍了这个主题,但不幸的是,我仍然遇到了一些麻烦。
我正在尝试订阅来自我网络上的windows box的运动捕捉数据流。mo-cap服务器通过我的网络进行广播,我可以在我的OS机器(“目标”)上使用wireshark获取数据。我看到从原始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我认为对于我目前的问题,忽略循环中的一些代码是安全的,因为其中一些代码来自我正在使用的助手库(optirx)。请注意,我并没有从所有选项开始,但决定将它们全部包括在内,以了解哪些应该留下来,哪些可以去掉。我尝试过各种组合和排列。我使用的是OS X 10.10.3
发布于 2015-09-07 08:07:53
问题出在这里:
datasock.bind((MULTICAST_ADDRESS, PORT))您不应该将套接字绑定到多播地址。您应该将它绑定到'0.0.0.0'。使用IP_ADD_MEMBERSHIP的setsockopt调用负责加入多播组。
https://stackoverflow.com/questions/32393580
复制相似问题