/* NAME: multicasr receiver SYNOPSIS: McastRcv DESCRIPTION: The program creates a datagram socket and joins a multicast group. It prints on the standard output all received message. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "packetReg.h" int main( int argc, char * argv[] ) { int s; struct sockaddr_in server; struct sockaddr_in from; int fromlen; int length; Packet pkt; int rc; struct ip_mreq mreq; /* multicast group info structure */ /* linux */ unsigned long int mcGroup; /* Solaris in_addr_t mcGroup; */ int reuse; if (argc != 3) { fprintf(stderr, "Usage : %s \n",argv[0]); exit(0); } s = socket (PF_INET,SOCK_DGRAM,0); reuse=1; if ( setsockopt(s,SOL_SOCKET,SO_REUSEADDR, (char *) &reuse,sizeof(reuse)) == -1 ){ printf("error in setsockopt,SO_REUSEPORT \n"); exit(-1); } server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(atoi(argv[2])); if (bind( s, (struct sockaddr *)&server, sizeof(server)) < 0) { fprintf(stderr, "Can't bind ....\n"); exit (-1); } /* Join Multicast Group */ if( (mcGroup = inet_addr(argv[1]))== -1) printf("error in inet_addr\n"); mreq.imr_multiaddr.s_addr = mcGroup; mreq.imr_interface.s_addr = INADDR_ANY; if ( setsockopt(s,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *) &mreq, sizeof(mreq)) == -1 ) { printf("error in joining group \n"); exit(-1); } /* get data from group and send it back */ for(;;){ fromlen = sizeof(from); printf("\n...server is waiting...\n"); if ((rc=recvfrom(s, (char *)&pkt, sizeof(pkt), 0, (struct sockaddr *)&from, &fromlen)) < 0) perror("receiving datagram message"); if (rc > 0){ printf("From %s:%d, %d bytes received\n", inet_ntoa(from.sin_addr), ntohs(from.sin_port), pkt.length); printf("%s wrote : %s ", pkt.name, pkt.msg); if (strncmp(pkt.msg, "STOP", 4)== 0) break; } } /* Leave multicast group */ mreq.imr_multiaddr.s_addr = mcGroup; mreq.imr_interface.s_addr = INADDR_ANY; if( setsockopt(s,IPPROTO_IP,IP_DROP_MEMBERSHIP, (char *) &mreq,sizeof(mreq)) == -1 ) { printf("error in leaving group \n"); exit(-1); } }