分类: LINUX
2016-09-01 14:24:23
IP multicasting provides the capability for an application to send a single IP datagram that a group of hosts in a network can receive. The hosts that are in the group may reside on a single subnet or may be on different subnets that connect multicast-capable routers. Hosts may join and leave groups at any time. There are no restrictions on the location or number of members in a host group. A class D Internet address in the range 224.0.0.1 to 239.255.255.255 identifies a host group.
An application program can send or receive multicast datagrams by using the socket() API and connectionless SOCK_DGRAM type sockets. Multicasting is a one-to-many transmission method. You cannot use connection-oriented sockets of type SOCK_STREAM for multicasting. When a socket of type SOCK_DGRAM is created, an application can use the setsockopt() function to control the multicast characteristics associated with that socket. The setsockopt() function accepts the following IPPROTO_IP level flags:
The following examples enable a socket to send and receive multicast datagrams. The steps needed to differ from the steps needed to .
Example: Sending a multicast datagram
The following example enables a socket to perform the steps listed below and to send multicast datagrams:
#include#include #include #include #include #include struct in_addr localInterface; struct sockaddr_in groupSock; int sd; int datalen; char databuf[1024]; int main (int argc, char *argv[]) { /* ------------------------------------------------------------*/ /* */ /* Send Multicast Datagram code example. */ /* */ /* ------------------------------------------------------------*/ /* * Create a datagram socket on which to send. */ sd = socket(AF_INET, SOCK_DGRAM, 0); if (sd < 0) { perror("opening datagram socket"); exit(1); } /* * Initialize the group sockaddr structure with a * group address of 225.1.1.1 and port 5555. */ memset((char *) &groupSock, 0, sizeof(groupSock)); groupSock.sin_family = AF_INET; groupSock.sin_addr.s_addr = inet_addr("225.1.1.1"); groupSock.sin_port = htons(5555); /* * Disable loopback so you do not receive your own datagrams. */ { char loopch=0; if (setsockopt(sd, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&loopch, sizeof(loopch)) < 0) { perror("setting IP_MULTICAST_LOOP:"); close(sd); exit(1); } } /* * Set local interface for outbound multicast datagrams. * The IP address specified must be associated with a local, * multicast-capable interface. */ localInterface.s_addr = inet_addr("9.5.1.1"); if (setsockopt(sd, IPPROTO_IP, IP_MULTICAST_IF, (char *)&localInterface, sizeof(localInterface)) < 0) { perror("setting local interface"); exit(1); } /* * Send a message to the multicast group specified by the * groupSock sockaddr structure. */ datalen = 10; if (sendto(sd, databuf, datalen, 0, (struct sockaddr*)&groupSock, sizeof(groupSock)) < 0) { perror("sending datagram message"); } }