gpt4 book ai didi

c - 从 UDP 多播树莓派读取

转载 作者:太空宇宙 更新时间:2023-11-04 07:27:35 25 4
gpt4 key购买 nike

我已经在这里 ( link ) 关于我正在做的这个项目开始了一个问题,我一直有很多问题。

在我之前的问题中,我想从同一台机器读取 udp 多播,我找到了如何做到这一点,但不是用 ipmidi。(如果你没有阅读上面链接的上一个问题,ipmidi 是一个用于 mac 的工具/win 允许我通过 UDP 多播发送 MIDI 事件)。

我一直在使用 wireshark 并设法看到 ipmidi 正在向 ip 225.0.0.37、端口 21928 发送数据报,这告诉我这实际上是一个多播。然后我用了 this代码(监听器)尝试回显 ipmidi 发送的数据报但没有成功(我更改了多播 ip 和端口)。在此之后,我决定尝试从树莓派上运行这段代码,因为我只是想让它在我的 mac 上运行以进行测试,所以我去了真实的地方。

在我的 raspi 中,我再次编译了代码,gcc 声称 setsockopt() 有一个无效参数。 perror() 很有用,足以告诉我问题出在这里:

setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))

所以我删除了它向内核请求多播地址的部分,并使其成为端口 21928 上的简单监听套接字,但它仍然无法工作。我让我的 mac 通过以太网将 midi 发送到 raspi。

现在,实际问题:

  1. 我现在怀疑我的多播知识:如果我的 mac 正在多播 ipmidi 的数据报,这意味着数据报正在通过我 mac 中所有可能的位置发送,对吧?我的意思是,IP 225.0.0.37 意味着通过 wifi 和以太网进行多播,或者我必须将它路由到我选择的网络接口(interface)?

  2. 据称我的 raspi 通过以太网接收数据报,让我的程序在 ipmidi 的数据报目标端口监听就足够了,还是我必须明确告诉它这些数据报来自“哪里”?

  3. 有没有更简单的方法来制作多播接收应用程序,例如 C/C++ 的 api?我目前正在使用 C 风格的套接字,正如您在我链接的代码中看到的那样,但这不是我正在做的程序的主要目的,我发现自己花了很多时间来学习网络而不是专注于真实的东西。

很抱歉问了这么长的问题,有很多疑问,我想了解一下上下文。

感谢您的帮助!

最佳答案

仅仅监听端口是不够的——如果你想看到发送到该组的数据报,你需要加入多播组。

setsockopt() 调用中的“无效参数”错误可能意味着您的 mreq 参数错误。对于您提供的多播地址,您应该这样做:

struct ip_mreqn mreq;

inet_aton("225.0.0.37", &mreq.imr_multiaddr);
mreq.imr_address.s_addr = htonl(INADDR_ANY);
mreq.imr_ifindex = 0;

关于c - 从 UDP 多播树莓派读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16800908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com