Multicast – tale dispositivo

Sto tentando di connettersi a un gruppo multicast utilizzando il seguente pezzo di codice:

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

e l’errore che ho ricevuto è il Valore di errno è tale dispositivo.

Sto cercando di realizzare questo su omap consiglio GB di porting.

Potrebbe per favore aiuto.

OriginaleL’autore android.developer | 2011-11-18

2 Replies
  1. 13

    Ho avuto un problema simile, anche se stavo usando l’interfaccia java.
    Nel mio caso, mi è stato sempre “No such device” errore fino a quando ho esplicitamente dichiarato che l’interfaccia dovrebbe essere la gestione di pacchetti multicast. Nel mio caso, che è stato un’interfaccia ethernet.
    Di nuovo, questo non è tranquillo il tuo caso, dal momento che si utilizza JNI, e anche perché probabilmente non c’è bisogno eth0, ma spero che ‘ ll aiutare:

    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);

    Quindi credo che l’idea è che se si dispone di più di 1 interfaccia, si dovrebbe specificare in modo esplicito quale si utilizza.

    Grande risposta risolto il mio problema:) Grazie!!!
    Trovare l’interfaccia di rete e di unirsi al gruppo che utilizza che per me ha funzionato anche su Android. Senza questo joinGroup(group) verrebbe a mancare con il messaggio di errore no such device.
    Risolto il mio problema! Grazie

    OriginaleL’autore Alexey

  2. 5

    probabilmente non hanno un percorso per il traffico multicast. Prova con:

    route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0
    So che è un vecchio post.. ma ho avuto lo stesso problema, solo che ora..
    In qualche modo ho preso quando la distribuzione di Cloudstack su una VM Virtualbox

    OriginaleL’autore nimig

Lascia un commento