C 从UDP多播raspberry pi读取
我已经在这里开始了一个关于我正在做的这个项目的问题,我一直有很多问题 在我前面的问题中,我想从同一台机器上阅读udp多播,我想知道如何做,但不是使用ipmidi。(如果您没有阅读上面链接的问题,ipmidi是mac/win的一个工具,它允许我通过udp多播发送midi事件) 我一直在与wireshark合作,设法发现ipmidi正在向ip 225.0.0.37、端口21928发送数据报,这告诉我,实际上是一个多播。 然后,我使用代码(侦听器)尝试回显ipmidi发送的数据报,但没有成功(我更改了多播ip和端口)。 在这之后,我决定尝试从raspberry pi运行这段代码,因为我只希望它在我的mac上运行以进行测试,所以我选择了真实的代码 在我的raspi中,我再次编译了代码,gcc声称C 从UDP多播raspberry pi读取,c,multicast,raspberry-pi,raspbian,C,Multicast,Raspberry Pi,Raspbian,我已经在这里开始了一个关于我正在做的这个项目的问题,我一直有很多问题 在我前面的问题中,我想从同一台机器上阅读udp多播,我想知道如何做,但不是使用ipmidi。(如果您没有阅读上面链接的问题,ipmidi是mac/win的一个工具,它允许我通过udp多播发送midi事件) 我一直在与wireshark合作,设法发现ipmidi正在向ip 225.0.0.37、端口21928发送数据报,这告诉我,实际上是一个多播。 然后,我使用代码(侦听器)尝试回显ipmidi发送的数据报,但没有成功(我更改了
setsockopt()
有一个无效参数peror()
非常有用,它告诉我问题就在这里:
setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))
因此,我删除了它向内核请求多播地址的部分,并在端口21928将其设置为一个简单的侦听套接字,但它仍然无法工作。
我让mac通过以太网向raspi发送midi
现在,实际问题是:
谢谢你的帮助 仅在端口上侦听是不够的-如果要查看发送到该组的数据报,需要加入多播组
setsockopt()
调用中的“Invalid Argument”错误可能意味着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;
仅仅监听端口是不够的——如果您想查看发送到该组的数据报,您需要加入多播组
setsockopt()
调用中的“Invalid Argument”错误可能意味着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;
因此,经过一些研究和尝试/错误后,我的问题是覆盆子pi被隐藏在我的mac电脑后面。 由于我的mac电脑将互联网交给了raspberry pi,所以raspi并没有捕捉到多播,这就是它未能加入的原因 关于setsockopt,我犯了与问题中最初相同的错误:在多播ip中是255而不是225。因此,IPPROTO_IP和IP_ADD_MEMBERSHIP选项是错误的,程序将在那里阻塞 现在正在工作,我已经开始编写midi规范
谢谢你的帮助,特别是@caf 所以,经过一些研究和尝试/错误后,我的问题是覆盆子皮被藏在我的mac电脑后面。 由于我的mac电脑将互联网交给了raspberry pi,所以raspi并没有捕捉到多播,这就是它未能加入的原因 关于setsockopt,我犯了与问题中最初相同的错误:在多播ip中是255而不是225。因此,IPPROTO_IP和IP_ADD_MEMBERSHIP选项是错误的,程序将在那里阻塞 现在正在工作,我已经开始编写midi规范
谢谢你的帮助,特别是@caf 对不起,我的错,我的意思是225.0.0.37-我在处理面具,我把它混在一起了up@AfonsoTsukamoto:请参阅更新的答案。我怀疑问题在于您使用的示例代码没有设置
mreq.imr\u iIndex
。让我继续说下去,谢谢您,我似乎没有太多的答案:P如果我使用mreq struct和如果我实际使用mreqn,那么会出现两个错误,说它不知道它的大小:/@AfonsoTsukamoto:你需要#include
来获得结构ip\u mreqn
的定义。我已经把它包括在内了,就像链接中的代码一样。您知道多播的责任实体是mac还是路由器吗?因为我的raspi“隐藏”在我的mac电脑后面,所以路由器可能无法看到raspi以便从多播向他发送dgrams。对不起,我的错,我的意思是225.0.0.37-我在处理掩码,我混合了它up@AfonsoTsukamoto:请参阅更新的答案。我怀疑问题在于您使用的示例代码没有设置mreq.imr\u iIndex
。让我继续说下去,谢谢您,我似乎没有太多的答案:P如果我使用mreq struct和如果我实际使用mreqn,那么会出现两个错误,说它不知道它的大小:/@AfonsoTsukamoto:你需要#include
来获得结构ip\u mreqn
的定义。我已经把它包括在内了,就像链接中的代码一样。您知道多播的责任实体是mac还是路由器吗?因为我的raspi“隐藏”在我的mac后面,所以路由器可能无法看到raspi,以便从多播向他发送DGRAM。