/* mcast-r.c: multicast receiver */ #include #include #include #include #include #include #define MAXSIZE 100 main(int argc, char *argv[]) { int s; /* s = socket */ struct sockaddr_in in_addr; /* Structure used for bind() */ struct sockaddr_in sock_addr; /* Output structure from getsockname */ struct sockaddr_in src_addr; /* Used to receive (addr,port) of sender */ int src_addr_len; /* Length of src_addr */ int len; /* Length of result from getsockname */ int mc_addr, port; struct ip_mreq mreq; struct hostent *host_entry_ptr; char line[MAXSIZE]; if (argc < 3) { printf("Usage: %s multicast_addr port\n", argv[0]); printf("Note: multicast_addr must be: 224.xx.xx.xx - 239.xx.xx.xx\n"); printf("Note: use udp4-s2 to send on multicast address\n"); exit(1); } mc_addr = inet_addr(argv[1]); port = atoi(argv[2]); /* --- Create a socket --- */ s = socket(AF_INET, SOCK_DGRAM, 0); /* --- Set up socket end-point info for binding --- */ in_addr.sin_family = AF_INET; /* Protocol domain */ in_addr.sin_addr.s_addr = INADDR_ANY; /* Use wildcard IP address */ in_addr.sin_port = htons(port); /* Use this UDP port */ /* --- Here goes the binding... --- */ if (bind(s, (struct sockaddr *)&in_addr, sizeof(in_addr)) == -1) { printf("Error: bind FAILED\n"); exit(1); } else { printf("OK: bind SUCCESS\n"); } /* *********************************************************************** Joining a IP-multicast group identified by the multicast address *********************************************************************** */ /* --------------------------------------------------------- 1. Setup multicast group enrollment information in `mreq' --------------------------------------------------------- */ mreq.imr_multiaddr.s_addr = mc_addr; /* Multicast group */ mreq.imr_interface.s_addr = htonl(INADDR_ANY); /* From any interface */ /* ----------------------------------------------------------------------- 2. Join multicast membership... (implemented with a hack in setsockopt) ----------------------------------------------------------------------- */ if (setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mreq, sizeof(mreq)) == -1) { printf("Error membership...\n"); exit(1); } /* ******************************************************************** DONE ! We are now ready for multicast packets on s The rest is similar to using a UDP socket to receive... NOTE: you CANNOT use a multicast socket to SEND messages Create another UDP socket for sending if you need to reply. ******************************************************************** */ while(1) { src_addr_len = sizeof(src_addr); len = recvfrom(s, line, MAXSIZE, 0 /* flags */, (struct sockaddr *) &src_addr, &src_addr_len); host_entry_ptr = gethostbyaddr((char *) &(src_addr.sin_addr.s_addr), sizeof(src_addr.sin_addr.s_addr), AF_INET); printf("Msg from (%s,%u): `%s' (%u bytes)\n", host_entry_ptr->h_name, src_addr.sin_port, line, len); } }