hi,
there're some os wher this is not required for receiving multicast packet.

man 7 ip
IP_ADD_MEMBERSHIP 
     Join a multicast group. Argument is a struct ip_mreqn structure. 


     struct ip_mreqn
     {
         struct in_addr imr_multiaddr; /* IP multicast group address */
         struct in_addr imr_address;   /* IP address of local interface */
         int            imr_ifindex;   /* interface index */
     };

     imr_multiaddr contains the address of the multicast group the application
wants to join or leave. It must be a valid multicast
     address. imr_address is the address of the local interface with which the
system should join the multicast group; if it is equal
     to INADDR_ANY an appropriate interface is chosen by the system. imr_ifindex
is the interface index of the interface that
     should join/leave the imr_multiaddr group, or 0 to indicate any interface. 
     For compatibility, the old ip_mreq structure is still supported. It differs
from ip_mreqn only by not including the
     imr_ifindex field. Only valid as a setsockopt(2). 

Calvin Austin wrote:
> 
> I don't know if anyone else can verify this, but the bug listed below
> seems to be BSD socket related (ie OS related)
> 
> I hacked some code together from an online example and included what
> Java does on the server side , compile cc -o serv serv.c and
> test with the Broadcaster client from the bug report.
> 
> If the ip address field is not used then the server gets the broadcast
> packets
> (it works) If the address is used then it doesn't. I'm thinking that
> this
> may be trapped elsewhere and not in Java
> 
> regards
> calvin
> 
> Jason Gilbert wrote:
> >
> 
> > 3) Bug 4191980
> > (http://developer.java.sun.com/developer/bugParade/bugs/4191980.html).
> >    It's amazing that this has been around since 1.1.6 (probably
> > earlier).  Sadly, if
> >    the jdk was in fact Free Software this would have easily been
> > fixed.  Don't mention
> >    the Sun open source license (I don't remember what it's called
> > today).  That's more
> >    of a lock-in than Microsoft.  At least they just lock you into
> > using there software
> >    by not being compatible with other software.  Sun wants people
> > to effectively lock
> >    themselves into using only the Sun implementation.  There
> > attempt at blocking
> >    'forking' basically would appear to block creating or working
> > on another implementation.
> >    Kaffe for instance.  Or blocking real innovation by allowing
> > someone to say, "hey,
> >    these people are completely off base with their impl, I could
> > make the JVM 100x faster
> >    by doing X"  and then release it under the GPL.  they're
> > already tainted.  I think the
> >    shortcoming is basically that Sun is trying to create this
> > "community" which seems to
> >    be on only a product by product basis when the real community
> > already exists which is
> >    the software developer community. small pond, largest pond.
> >
> 
> > jason
> >
> > --
> > Jason Gilbert | http://home.hiwaay.net/~gilbertj/
> > ------------------------------------------------------
> > I wish I could make the garbage collector thread in my
> > brain less aggressive.
> >
> > ----------------------------------------------------------------------
> > To UNSUBSCRIBE, email to [EMAIL PROTECTED]
> > with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
> 
>   --------------------------------------------------------------------------------
> #include <stdio.h>
>  #include <string.h>
>  #include <errno.h>
>  #include <sys/socket.h>
> 
>  #include <netinet/in.h>
>  #include <arpa/inet.h>
> 
>  typedef int                    SIZE_T;
>  #define PACKET_SIZE            1024
> 
> 
>  main(int argc, char **argv)
>  {
>          int            rr;
>          int            rc;
>          int            sockfd;
>          SIZE_T          client_addr_len;
>          char            *cmd_name;
>          char            send_data[PACKET_SIZE];
>          char            recv_data[PACKET_SIZE];
>          struct sockaddr_in      servaddr;
>          struct sockaddr client_addr;
> 
>          cmd_name = argv[0];
> 
>          /*
>          * Create a socket.
>          */
>          sockfd = socket(AF_INET, SOCK_DGRAM, 0);
>          if (sockfd < 0) {
>                  printf("%s: socket errno = %d\n", cmd_name, errno);                 
>exit(-1);
>          }
> 
>          /*
>          * Initialize the address the socket will bind to.
>          */
>          bzero(&servaddr, sizeof(servaddr));
>          servaddr.sin_family      = AF_INET;
>          servaddr.sin_port        = htons(3000);
>          /*
>          * NOTE: assigning INADDR_ANY works
>   but listening to the machines own address does not receive broadcast
> udp for that subnet */
>          servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
>          /*servaddr.sin_addr.s_addr = htonl(0x81907D7C);*/
>          /*servaddr.sin_addr.s_addr = htonl(0x81907D6F);*/
> 
>          /*
>          * Bind the socket to the address.
>          */
>          rc = bind(sockfd, (struct sockaddr *) &servaddr,
>                    sizeof(servaddr));
>          if (rc < 0) {
>                  printf("%s: bind errno = %d\n", cmd_name, errno);                 
>exit(-1);
>          }
> 
>          /*
>          * In each loop iteration, we wait for a packet from the         * client.  
>When a packet arrives, we echo its contents
>          * and send a response back to the client of the form
>          * "response #rr".
>          */
>          for (rr = 1; ; rr++) {
>                  client_addr_len = sizeof(client_addr);
>                  printf("%s: about to receive packet\n", cmd_name);                 
>fflush(stdout);
>                  /*
>                  * Wait for a packet from the client.
>                  */
>                  rc = recvfrom(sockfd, recv_data, PACKET_SIZE, 0,                    
>           &client_addr, &client_addr_len);                 if (rc
>  < 0) {
>                          printf("%s: recvfrom failed: errno = %d\n",                 
>                cmd_name, errno);
>                  } else {
>                          printf("%s: recvfrom received packet #%d: %s\n",            
>                     cmd_name, rr, recv_data);
>                  }
>          }
>  }


-- 
 -- Levente
 "The only thing worse than not knowing the truth is
  ruining the bliss of ignorance."


----------------------------------------------------------------------
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to