Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从UDP多播raspberry pi读取_C_Multicast_Raspberry Pi_Raspbian - Fatal编程技术网

C 从UDP多播raspberry pi读取

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发送的数据报,但没有成功(我更改了

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

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

我一直在与wireshark合作,设法发现ipmidi正在向ip 225.0.0.37、端口21928发送数据报,这告诉我,实际上是一个多播。 然后,我使用代码(侦听器)尝试回显ipmidi发送的数据报,但没有成功(我更改了多播ip和端口)。 在这之后,我决定尝试从raspberry pi运行这段代码,因为我只希望它在我的mac上运行以进行测试,所以我选择了真实的代码

在我的raspi中,我再次编译了代码,gcc声称
setsockopt()
有一个无效参数
peror()
非常有用,它告诉我问题就在这里:

setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))
因此,我删除了它向内核请求多播地址的部分,并在端口21928将其设置为一个简单的侦听套接字,但它仍然无法工作。 我让mac通过以太网向raspi发送midi

现在,实际问题是:

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

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

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

  • 很抱歉问了这么长的问题,有很多疑问,我想了解一下情况


    谢谢你的帮助

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

    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。