मैं लूपबैक पते पर यूडीपी मल्टीकास्ट पैकेट भेजना चाहता हूं और इसे अन्य एप्लिकेशन में प्राप्त करना चाहता हूं। फेडोरा कोर 17 लिनक्स पर किए गए सभी परीक्षण।लूपबैक डिवाइस पर मल्टीकास्टिंग
विचार आरटीएसपी/HTTP या किसी अन्य नेटवर्क प्रोटोकॉल के माध्यम से एक वीडियो स्ट्रीम प्राप्त करना है और इसे लूपबैक पते पर मल्टीकास्ट करना है ताकि मैं मल्टीकास्ट पते का उपयोग करके स्ट्रीम खेलने के लिए वीएलसी का उपयोग कर सकूं। अन्य बिटरेट और नियंत्रित मल्टीकास्ट मुद्दों को छोड़कर, मैंने एक वीडियो फ़ाइल और लूपबैक डिवाइस पर मल्टीकास्ट पढ़ने की कोशिश की। लेकिन जब वीएलसी पर इसे चलाने की कोशिश की तो यह काम नहीं किया। मैं देखना चाहता पैकेट wireshark में प्रेषित हो रही लेकिन src आईपी मेरा डिफ़ॉल्ट नेटवर्क इंटरफेस से (यानी इंटरफ़ेस जो मेरा डिफ़ॉल्ट प्रवेश द्वार है)
मैं पहले से ही आदेशों
sudo ifconfig लो बहुस्त्र्पीय निम्नलिखित की कोशिश की है लिया जाता है में सक्षम हूँ sudo ip मार्ग 239.252.10.10 dev lo
इस संबंध में कोई भी सुझाव बहुत उपयोगी होगा।
टेस्ट प्रोग्राम कोड नीचे
#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;
}
क्या आपके पास कोई समाधान है ?? मुझे भी एक ही समस्या है। – user2990252