0

我已经在这里(链接)开始了一个关于我正在做的这个项目的问题,并且我一直遇到很多问题。

在我之前的问题中,我想从同一台机器上读取 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。

现在,实际问题:

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

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

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

很抱歉这个问题很长,有很多疑问,我想在上下文中。

谢谢您的帮助!

4

2 回答 2

2

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

您调用中的“无效参数”错误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;
于 2013-05-28T21:36:26.190 回答
1

所以,经过一些研究和试验/错误,我的问题是树莓派隐藏在我的 mac 后面。由于我的 mac 正在为树莓派提供互联网,因此多播没有被 raspi 捕获,因此它未能加入它的原因。

关于 setsockopt,我在问题中犯了同样的错误:多播 ip 中的 255 而不是 225。因此,选项 IPPROTO_IP 和 IP_ADD_MEMBERSHIP 是错误的,程序会在那里阻塞。

现在正在工作,我已经开始编写 midi 规范。

感谢您的帮助,特别是@caf。

于 2013-06-14T19:50:04.233 回答