#include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef NULL #define NULL (void*)0 #endif #ifndef INADDR_NONE #define INADDR_NONE 0xffffffff #endif #define BUFSIZE 100 char buff[BUFSIZE]; #define SERV_UDP_PORT 2047 main(int argc, char *argv[]) { int sockfd,i,s,alen,hlen,mlen,count; struct sockaddr_in serv_addr; struct ip_mreq mreq; unsigned long inaddr; if (argc==1) { printf("USAGE: recv_udpm A.B.C.D\n"); exit(0); } /* open UDP socket */ if ((sockfd = socket(AF_INET,SOCK_DGRAM,0)) < 0 ) { perror("error open socket"); exit(-1); } alen = sizeof(serv_addr); memset(&serv_addr, NULL, alen); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* Try to convert group address as a dotted-decimal number. */ if ( (inaddr = inet_addr(argv[1])) != INADDR_NONE) { /* it's dotted-decimal */ /* memcpy(&serv_addr.sin_addr, &inaddr, sizeof(inaddr));*/ } else { printf("Problems with this group address...\n"); exit(0); } serv_addr.sin_port = htons(SERV_UDP_PORT); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { perror("bind"); exit(-1); } mlen = sizeof(mreq); memset(&mreq, NULL, mlen); mreq.imr_multiaddr.s_addr = inaddr; mreq.imr_interface.s_addr = INADDR_ANY; setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mreq, mlen); count = 0; for (;;) { i = recvfrom(sockfd,buff,BUFSIZE,0,(struct sockaddr *)&serv_addr,&alen); if (i < 0) { printf("rec error"); exit(1); } printf("rec-data %d ",count++); for (s = 0; s < i; s++) /* print data received*/ printf("%c",buff[s]); printf("\n"); } }