2013-04-15 10 views
9

मैं लूपबैक पते पर यूडीपी मल्टीकास्ट पैकेट भेजना चाहता हूं और इसे अन्य एप्लिकेशन में प्राप्त करना चाहता हूं। फेडोरा कोर 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; 
    } 
+0

क्या आपके पास कोई समाधान है ?? मुझे भी एक ही समस्या है। – user2990252

उत्तर

0

मैं यूडीपी बहुस्त्र्पीय पैकेट भेजने के लिए इच्छा चिपकाया पता

बंद करो लूपबैक वहीं। आप ऐसा नहीं कर सकते यह नामुमकिन है। आप मल्टीकास्ट पते पर मल्टीकास्ट भेज सकते हैं। आपका कोड कोई मल्टीकास्टिंग नहीं करता है, बस 127.0.0.1 को भेज रहा है।

यदि आप केवल स्थानीयहोस्ट को भेज रहे हैं, तो आप मल्टीकास्ट का उपयोग क्यों कर रहे हैं? क्या आपके पास एकाधिक सुनने की प्रक्रिया है?

src आईपी, (अर्थात इंटरफ़ेस जो मेरा डिफ़ॉल्ट प्रवेश द्वार है)

बहुत संभावना है मेरा डिफ़ॉल्ट नेटवर्क इंटरफेस से लिया रूप में आप अपने सॉकेट बाध्य नहीं है है। आपने क्या उम्मीद किया?

+0

मल्टीकास्ट पता कमांड लाइन से दिया जा सकता है जिसे गंतव्य आईपी के रूप में लिया जाता है। मूल रूप से मैं जो भी मुझे लूपबैक इंटरफ़ेस में एक मल्टीकास्ट तरीके से प्राप्त करना चाहता हूं ताकि एक एप्लिकेशन इसे फ़ाइल में रिकॉर्ड करने के लिए प्राप्त कर सके, जबकि दूसरा एप्लिकेशन इसे चलाता है और इसी तरह। यही कारण है कि मल्टीकास्ट गंतव्य udp पैकेट के गंतव्य आईपी के लिए सेट है। –

+0

इंटरफ़ेस src ip के लिए भी अगर मैं सॉकेट को 127.0.0.1 तक बाध्य करता हूं, फिर भी यह आउटगोइंग पैकेट में नहीं लेता है। –

+2

@EJP क्या होगा यदि मैं एक उप-पब प्रकार में एक स्ट्रीम से कई प्रक्रियाओं को पढ़ना चाहता हूं? उदाहरण के लिए लाइव वीडियो। – Aron

13

आप लूपबैक पर मल्टीकास्ट का उपयोग कर सकते हैं, लेकिन आपको एक नया मार्ग जोड़ना होगा क्योंकि आपका ओएस डिफ़ॉल्ट रूप से मल्टीकास्ट के लिए डिफ़ॉल्ट बाहरी इंटरफ़ेस का उपयोग कर रहा है। लूपबैक पर डिफ़ॉल्ट रूप से मल्टीकास्ट अक्षम भी किया जा सकता है। लिनक्स पर आप इसे इस कमांड के साथ बदल सकते हैं:

route add -net 224.0.0.0 netmask 240.0.0.0 dev lo 
ifconfig lo multicast 
संबंधित मुद्दे