多播回环设备上 [英] Multicasting on loopback device

查看:168
本文介绍了多播回环设备上的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要发送UDP多播数据包环回地址和接收到其他应用程序一样。在Fedora Core完成所有测试17的Linux。

我们的想法是通过RTSP / HTTP或任何其他网络协议接收视频流和多播它的回送地址,这样我可以使用VLC播放使用多播地址的数据流。撇开其他的比特率和可控组播的问题,我试图读取一个视频文件,多点传送回设备。但是当使用时播放相同的VLC它并没有奏效。我能看到包在Wireshark中得到传播,但源IP是从我的默认网络接口取(即接口这是我的默认网关)

我已经尝试下面的命令

sudo的使用ifconfig LO组播
sudo的IP路由添加239.252.10.10开发LO

在这方面的任何建议将是非常有益的。

测试程序code粘贴以下

 的#include< SYS / types.h中>
    #包括LT&; SYS / socket.h中>
    #包括LT&; ARPA / inet.h>
    #包括LT&; netinet / in.h中>
    #包括LT&;&stdio.h中GT;
    #包括LT&;&stdlib.h中GT;
    #包括LT&;&string.h中GT;
    #包括LT&;&unistd.h中GT;
    #定义MULTICAST_ADDRESS239.252.10.10
    #定义UDP_PORT 1234
    #定义INTERFACE_IP127.0.0.1
    #定义MTU 1474
    #定义DATA_BUFFER_SIZE(1024 * 1024)    静态INT socket_init(字符* intf_ip){
    诠释SD;
    struct in_addr,这个localInterface;      SD =插座(AF_INET,SOCK_DGRAM,0);
      如果(SD< 0){
          PERROR(打开数据报套接字错误);
          返回-1;
      }
      其他
        的printf(打开数据报套接字... OK \\ n);      localInterface.s_addr = inet_addr(intf_ip);      如果(setsockopt的(SD,IPPROTO_IP,IP_MULTICAST_IF,(字符*)及localInterface,sizeof的(localInterface))小于0){
          PERROR(设置本地接口错误);
          关闭(SD);
          返回-1;
      }
      其他
        的printf(设置本地接口... OK \\ n);
    1#如果
        焦炭loopch = 1;        如果(setsockopt的(SD,IPPROTO_IP,IP_MULTICAST_LOOP,(字符*)及loopch,sizeof的(loopch))小于0){
        PERROR(设置IP_MULTICAST_LOOP错误);
        关闭(SD);
        返回-1;
        }
        其他
        的printf(启用环回... OK \\ n);
    #万一
      返回SD;    }
    静态INT transmit_packet(INT SD,字符* DATABUF,诠释大小,字符*的IP,无符号短端口){    结构SOCKADDR_IN groupSock;
    INT LEN,DATALEN,钢筋混凝土;      memset的((字符*)及groupSock,0,sizeof的(groupSock));      groupSock.sin_family = AF_INET;      groupSock.sin_addr.s_addr = inet_addr(IP);      groupSock.sin_port = htons(端口);      LEN = 0;
      DATALEN = MTU;
      如果(大小< MTU)
        DATALEN =大小;      而(LEN<大小){
        RC = SENDTO(SD,DATABUF,DATALEN,0,(结构sockaddr *)及groupSock,sizeof的(groupSock));
        如果(RC℃,){
          PERROR(发送数据报消息错误);
          返回-1;
        }
        usleep(10000);
        LEN + = RC;
      }
      返回LEN;
    }    静态INT transmit_file(字符*文件路径,字符* dstip,字符* srcip,无符号短端口){
    FILE * FP;
    INT SD,RC;
    字符* DATABUF;
        FP = FOPEN(文件路径,R);
        如果(!FP){
        的printf(transmit_file:没有这样的文件或目录%s \\ n,文件路径);
        返回-1;
        }
        SD = socket_init(srcip);
        如果(SD< 0){
        的printf(套接字初始化失败\\ n);
        FCLOSE(FP);
        返回-1;
        }
        DATABUF =(字符*)malloc的(的sizeof(char)的* DATA_BUFFER_SIZE);
        如果(!DATABUF){
        的printf(无法分配DATABUF \\ n);
        关闭(SD); FCLOSE(FP);
        返回-1;
        }
        而(!的feof(FP)){
        RC = FREAD(DATABUF,1,DATA_BUFFER_SIZE,FP);
        如果(RC&下; = 0){
            的printf(读取失败或EOF达到\\ n);
            打破;
        }
        如果(transmit_packet(SD,DATABUF,RC,dstip,口)℃下)
            的printf(发送失败\\ n);
        }
        关闭(SD); FCLOSE(FP);
        免费(DATABUF);
        返回0;
    }    INT主(INT ARGC,CHAR *的argv []){       如果(argc个!= 3){
        的printf(%S<&名GT;<知识产权及GT; \\ N的argv [0]);
        返回-1;
       }
       transmit_file(的argv [1],的argv [2],INTERFACE_IP,UDP_PORT);
       返回0;
    }


解决方案

您可以使用多播的环回,但你有因为使用默认的外部接口,默认情况下,多播操作系统添加一个新的途径。也可以多播默认情况下,环回被禁用。在Linux上,你可以用这个命令更改此:

 路由添加224.0.0.0 -net网络掩码240.0.0.0开发卤味
使用ifconfig LO组播

I wish to send UDP multicast packets to loopback address and receive the same in other application. All tests done on fedora core 17 Linux.

The idea is to receive a video stream via RTSP/HTTP or any other network protocol and multicast it on the loopback address so that I can use VLC to play the stream using multicast address. Leaving aside other bitrate and controlled multicast issues, i tried to read one video file and multicast on loopback device. But when tried to play the same on vlc it didn't worked. I'm able to see packet getting transmitted in wireshark but the src ip is taken from my default network interface(i.e interface which is my default gateway)

I have already tried following commands

sudo ifconfig lo multicast sudo ip route add 239.252.10.10 dev lo

Any suggestion in this regard would be very helpful.

Test program code pasted below

            #include <sys/types.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <netinet/in.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>


    #define MULTICAST_ADDRESS "239.252.10.10"
    #define UDP_PORT 1234
    #define INTERFACE_IP    "127.0.0.1"
    #define MTU 1474
    #define DATA_BUFFER_SIZE  (1024*1024)

    static int  socket_init(char *intf_ip) {
    int sd;
    struct in_addr localInterface;

      sd = socket (AF_INET, SOCK_DGRAM, 0);
      if (sd < 0) {
          perror ("Opening datagram socket error");
          return -1;
      }
      else
        printf ("Opening the datagram socket...OK.\n");

      localInterface.s_addr = inet_addr (intf_ip);

      if (setsockopt(sd, IPPROTO_IP, IP_MULTICAST_IF, (char *) &localInterface,sizeof (localInterface)) < 0){
          perror ("Setting local interface error");
          close(sd);
          return -1;
      }
      else
        printf ("Setting the local interface...OK\n");
    #if 1
        char loopch = 1;

        if(setsockopt(sd, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&loopch, sizeof(loopch)) < 0){
        perror("Setting IP_MULTICAST_LOOP error");
        close(sd);
        return -1;
        }
        else
        printf("Enabling the loopback...OK.\n");
    #endif
      return sd;

    }


    static int transmit_packet(int sd, char *databuf, int size,char *ip, unsigned short port){

    struct sockaddr_in groupSock;
    int len,datalen,rc;

      memset ((char *) &groupSock, 0, sizeof (groupSock));

      groupSock.sin_family = AF_INET;

      groupSock.sin_addr.s_addr = inet_addr (ip);

      groupSock.sin_port = htons (port);

      len=0;
      datalen = MTU;
      if(size < MTU)
        datalen = size;

      while(len < size){
        rc = sendto(sd, databuf, datalen, 0, (struct sockaddr *) &groupSock,sizeof (groupSock));
        if(rc <0){
          perror ("Sending datagram message error");
          return -1;
        }
        usleep(10000);
        len += rc;
      }
      return len;
    }

    static int transmit_file(char *filepath, char *dstip, char *srcip,unsigned short port) {
    FILE *fp;
    int sd,rc;
    char *databuf;


        fp = fopen(filepath, "r");
        if(!fp) {
        printf("transmit_file : no such file or directory %s \n",filepath);
        return -1;
        }
        sd = socket_init(srcip);
        if(sd < 0) {
        printf("Socket initialization failed \n");
        fclose(fp);
        return -1;
        }
        databuf = (char*) malloc(sizeof(char)*DATA_BUFFER_SIZE);
        if(!databuf) {
        printf("Unable to allocate databuf\n");
        close(sd);fclose(fp);
        return -1;
        }
        while(!feof(fp)){
        rc = fread(databuf,1,DATA_BUFFER_SIZE,fp);
        if(rc<= 0) {
            printf("read failed or EOF reached\n");
            break;
        }           
        if(transmit_packet(sd,databuf,rc,dstip,port) <0)
            printf("Transmit failed\n");    
        }
        close(sd);fclose(fp);
        free(databuf);
        return 0;
    }

    int main(int argc, char *argv[]){

       if(argc != 3){
        printf("%s <filename> <ip>\n",argv[0]);
        return -1;
       }
       transmit_file(argv[1],argv[2],INTERFACE_IP,UDP_PORT);
       return 0;
    }

解决方案

You can use multicast on loopback but you have to add a new route because your OS using default external interface by default for multicast. Also multicast can be disabled by default on loopback. On linux you can change this with this command :

route add -net 224.0.0.0 netmask 240.0.0.0 dev lo
ifconfig lo multicast

这篇关于多播回环设备上的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆