从UDP多播树莓派中读取

时间:2013-05-28 20:29:09

标签: c multicast raspberry-pi raspbian

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

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

我一直在使用wireshark并设法看到ipmidi正在向ip 225.0.0.37端口21928发送数据报,它告诉我实际上是一个多播。 然后我使用this代码(监听器)尝试回显ipmidi发送的数据报没有成功(我更改了组播IP和端口)。 在此之后,我决定尝试从raspberry pi运行此代码,因为我只想在我的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的数据报目标端口监听就足够了,或者我必须明确地告诉它'这些数据报来自何处?< / p>

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

  4. 很抱歉这个长期的问题,很多疑惑,我想成为上下文。

    感谢您的帮助!

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

所以,经过一些研究和试验/错误我的问题是覆盆子pi被隐藏在我的mac后面。 由于我的mac正在为覆盆子pi提供互联网,因此多播并未被raspi捕获,因此无法加入它。

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

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

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