分类: LINUX
2016-09-01 14:30:15
The following example enables a socket to perform the steps listed below and to receive multicast datagrams:
#include#include #include #include #include #include struct sockaddr_in localSock; struct ip_mreq group; int sd; int datalen; char databuf[1024]; int main (int argc, char *argv[]) { /* ------------------------------------------------------------*/ /* */ /* Receive Multicast Datagram code example. */ /* */ /* ------------------------------------------------------------*/ /* * Create a datagram socket on which to receive. */ sd = socket(AF_INET, SOCK_DGRAM, 0); if (sd < 0) { perror("opening datagram socket"); exit(1); } /* * Enable SO_REUSEADDR to allow multiple instances of this * application to receive copies of the multicast datagrams. */ { int reuse=1; if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) < 0) { perror("setting SO_REUSEADDR"); close(sd); exit(1); } } /* * Bind to the proper port number with the IP address * specified as INADDR_ANY. */ memset((char *) &localSock, 0, sizeof(localSock)); localSock.sin_family = AF_INET; localSock.sin_port = htons(5555);; localSock.sin_addr.s_addr = INADDR_ANY; if (bind(sd, (struct sockaddr*)&localSock, sizeof(localSock))) { perror("binding datagram socket"); close(sd); exit(1); } /* * Join the multicast group 225.1.1.1 on the local 9.5.1.1 * interface. Note that this IP_ADD_MEMBERSHIP option must be * called for each local interface over which the multicast * datagrams are to be received. */ group.imr_multiaddr.s_addr = inet_addr("225.1.1.1"); group.imr_interface.s_addr = inet_addr("9.5.1.1"); if (setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)) < 0) { perror("adding multicast group"); close(sd); exit(1); } /* * Read from the socket. */ datalen = sizeof(databuf); if (read(sd, databuf, datalen) < 0) { perror("reading datagram message"); close(sd); exit(1); } }