2011-11-18 27 views
5

tôi đang cố gắng để kết nối với một nhóm multicast bằng cách sử dụng đoạn mã sau:Multicast - không có thiết bị như vậy

int flag_on = 1;    /* socket option flag */ 
    struct sockaddr_in mc_addr; /* socket address structure */ 
    char recv_str[MAX_LEN+1];  /* buffer to receive string */ 
    int recv_len;     /* length of string received */ 
    char* mc_addr_str;   /* multicast IP address */ 
    unsigned short mc_port;  /* multicast port */ 
    struct sockaddr_in from_addr; /* packet source */ 
    unsigned int from_len;  /* source addr length */ 


    mc_addr_str = ip;  /* arg 1: multicast ip address */ 
    mc_port = port; /* arg 2: multicast port number */ 

    /* validate the port range */ 
    if ((mc_port < MIN_PORT) || (mc_port > MAX_PORT)) { 
    fprintf(stderr, "Invalid port number argument %d.\n", 
      mc_port); 
    fprintf(stderr, "Valid range is between %d and %d.\n", 
      MIN_PORT, MAX_PORT); 
    exit(1); 
    } 

    /* create socket to join multicast group on */ 
// if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 
    if ((sock = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP)) < 0) { 
    perror("socket() failed"); 
    LOGE("*********Inside Join Multicast -- socket() failed*********"); 
    exit(1); 
    } 
    LOGE("Socket value = %d ",sock); 
    /* set reuse port to on to allow multiple binds per host */ 
    if ((setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag_on, 
     sizeof(flag_on))) < 0) { 
    perror("setsockopt() failed"); 
    LOGE("*********Inside Join Multicast -- socketopt() failed*********"); 

    exit(1); 
    } 

    /* construct a multicast address structure */ 
    memset(&mc_addr, 0, sizeof(mc_addr)); 
    mc_addr.sin_family  = AF_INET; 
    mc_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    mc_addr.sin_port  = htons(mc_port); 

    /* bind to multicast address to socket */ 
    if ((bind(sock, (struct sockaddr *) &mc_addr, 
     sizeof(mc_addr))) < 0) { 
    perror("bind() failed"); 
    LOGE("*********Inside Join Multicast -- bind() failed*********"); 
    exit(1); 
    } 

    /* construct an IGMP join request structure */ 
    mc_req.imr_multiaddr.s_addr = inet_addr(mc_addr_str); 
    mc_req.imr_interface.s_addr = htonl(INADDR_ANY); 

    /* send an ADD MEMBERSHIP message via setsockopt */ 
    if ((setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, 
     (void*) &mc_req, sizeof(mc_req))) < 0) { 
    perror("setsockopt() failed"); 
    LOGE("*********Inside Join Multicast -- socketopt2() failed*********"); 
    LOGE("Value of errno is %s",strerror(errno)); 
exit(1); 
    } 

và lỗi tôi đã nhận được là giá trị gia tăng của errno là Không có thiết bị như vậy.

Tôi đang cố gắng đạt được điều này trên bảng omap - GB được chuyển.

Bạn có thể vui lòng trợ giúp.

Trả lời

11

Tôi gặp sự cố rất giống nhau, mặc dù tôi đã sử dụng giao diện java. Trong trường hợp của tôi, tôi đã nhận được lỗi "Không thiết bị như vậy" cho đến khi tôi tuyên bố rõ ràng giao diện nào sẽ xử lý các gói đa phương tiện. Trong trường hợp của tôi, đó là một giao diện ethernet. Một lần nữa đây không phải là im lặng trường hợp của bạn, vì bạn đang sử dụng JNI, và cũng vì có thể bạn không cần eth0, nhưng tôi hy vọng nó sẽ giúp:

Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces(); 
NetworkInterface eth0 = null; 
while (enumeration.hasMoreElements() { 
    eth0 = enumeration.nextElement() 
    if (eth0.getName().equals("eth0")) { 
     //there is probably a better way to find ethernet interface 
     break; 
    } 
} 

InetAddress group = InetAddress.getByName(IP); 
MulticastSocket s = new MulticastSocket(PORT); 
s.setSoTimeout(10000); 
//s.joinGroup(group); //this will throw "No such device" exception 
s.joinGroup(new InetSocketAddress(group, PORT), eth0); // this works just fine 

for (int i = 0; i < 10; ++i) { 
    byte[] buf = new byte[8096]; 
    DatagramPacket recv = new DatagramPacket(buf, buf.length); 
    s.receive(recv); 
    System.out.println("Recieved " + recv.getLength() + " bytes."); 
} 

s.leaveGroup(group); 

Vì vậy, tôi đoán ý tưởng là nếu bạn có nhiều hơn 1 giao diện, bạn nên chỉ định rõ ràng giao diện nào bạn đang sử dụng.

+0

Câu trả lời tuyệt vời đã giải quyết được vấn đề của tôi :) Cảm ơn !! – info

+0

Tìm giao diện mạng và tham gia nhóm bằng cách sử dụng cũng hoạt động với tôi trên Android. Nếu không có 'joinGroup (group)' này sẽ thất bại với thông báo lỗi 'no such device'. – praneetloke

+0

Giải quyết được vấn đề của tôi! Cảm ơn – Semaphor

5

bạn có thể không có lộ trình cho lưu lượng truy cập đa phương tiện của mình. Hãy thử với:

route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0 
+0

Tôi biết đó là một bài đăng cũ .. nhưng tôi đã có cùng một vấn đề ngay bây giờ .. – nimig

+0

Tôi bằng cách nào đó đã có nó khi triển khai Cloudstack trên VirtualBox VM – KWubbufetowicz

Các vấn đề liên quan