在回送设备上进行多播

我希望发送UDP组播数据包到环回地址,并在其他应用程序中接收。 所有的testing在Fedora Core 17 Linux上完成。

我们的想法是通过RTSP / HTTP或任何其他networking协议接收videostream,并在回送地址上多播它,以便我可以使用VLC使用多播地址播放stream。 撇开其他比特率和受控组播的问题,我试图读取一个video文件和组播环回设备上。 但是当试图在vlc上播放时,它没有奏效。 我能看到数据包在wireshark中传输,但src ip是从我的默认networking接口(即接口,这是我的默认网关)

我已经尝试过下面的命令

sudo ifconfig lo多播sudo ip route添加239.252.10.10 dev lo

在这方面的任何build议将是非常有帮助的。

testing程序代码粘贴在下面

#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; } 

Solutions Collecting From Web of "在回送设备上进行多播"

您可以在回送中使用组播,但是您必须添加新的路由,因为您的操作系统默认使用默认的外部接口进行组播。 此外,组播可以在环回时默认禁用。 在Linux上,你可以用这个命令来改变它:

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

我希望发送UDP组播数据包到环回地址

停在那儿。 你不能这样做。 不可能。 您只能将多播发送到多播地址。 你的代码不会做任何多播,只是发送到127.0.0.1。

如果你只是发送到本地主机,为什么你使用多播呢? 你有多个听音过程吗?

src ip是从我的默认网络接口(即我的默认网关接口)

很可能,因为你还没有绑定你的套接字。 你期待什么?