我已经在这里(链接)开始了一个关于我正在做的这个项目的问题,并且我一直遇到很多问题。
在我之前的问题中,我想从同一台机器上读取 udp 多播,我发现了如何做到这一点,但不是使用 ipmidi。(如果您没有阅读上面链接的上一个问题,ipmidi 是 mac/win 的工具允许我通过 UDP 多播发送 midi 事件)。
我一直在使用wireshark,并设法看到ipmidi 正在向ip 225.0.0.37 端口21928 发送数据报,这告诉我实际上是多播。然后我使用这段代码(监听器)尝试回显 ipmidi 发送的数据报,但没有成功(我更改了多播 ip 和端口)。在此之后,我决定尝试从树莓派运行这段代码,因为我只想让它在我的 mac 中运行以进行测试,所以我去了真实的东西。
在我的 raspi 中,我再次编译了代码,gcc 声称它setsockopt()
有一个无效的参数。perror()
足以告诉我问题出在这里:
setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))
所以我删除了它向内核请求多播地址的部分,并使其成为端口 21928 的简单侦听套接字,但它仍然无法工作。我让我的 mac 通过以太网将 midi 发送到 raspi。
现在,实际问题:
我现在怀疑我的多播知识:如果我的 mac 正在多播 ipmidi 的数据报,这意味着数据报正在通过我的 mac 中所有可能的地方发送,对吗?我的意思是,ip 225.0.0.37 意味着通过 wifi 和以太网进行多播,或者我必须将它路由到我选择的网络接口?
据称,由于我的 raspi 是通过以太网接收数据报,因此让我的程序在 ipmidi 的数据报目标端口上侦听就足够了,还是我必须明确告诉它这些数据报来自哪里?
有没有更简单的方法来制作多播接收应用程序,比如 C/C++ 的 api?我目前正在使用 C 风格的套接字,正如您在我链接的代码中看到的那样,但这不是我正在做的程序的主要目的,我发现自己花了很多时间来学习网络而不是专注于真实的东西。
很抱歉这个问题很长,有很多疑问,我想在上下文中。
谢谢您的帮助!