#include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int cnt; int s_mc; int rcvbuf_len; struct sockaddr_in addr; int addrlen; struct ip_mreq mreq; unsigned char buf[16]; /* * INIT MULTICAST COMM */ if ((s_mc = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP)) == -1) { fprintf(stderr, "client: Multicast socket() open fail. %s\n", strerror(errno)); exit(EXIT_FAILURE); } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(25000); addr.sin_addr.s_addr = inet_addr("224.0.0.250"); addrlen = sizeof(addr); if (bind(s_mc, (struct sockaddr *) &addr, sizeof(addr)) == -1) { fprintf(stderr, "client: Multicast bind() port fail. %s\n", strerror(errno)); exit(EXIT_FAILURE); } mreq.imr_multiaddr.s_addr = inet_addr("224.0.0.250"); mreq.imr_interface.s_addr = INADDR_ANY; if (setsockopt(s_mc, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) == -1) { fprintf(stderr, "client: Multicast setsockopt(IP_ADD_MEMBERSHIP) fail. %s\n", strerror(errno)); exit(EXIT_FAILURE); } /* 2048 works */ /* rcvbuf_len = 2048; */ /* 1024 does not work */ rcvbuf_len = 1024; if (setsockopt(s_mc, SOL_SOCKET, SO_RCVBUF, (const void *)&rcvbuf_len, sizeof(rcvbuf_len)) == -1) { fprintf(stderr, ": Multicast setsockopt(SO_RCVBUF) fail. %s\n", strerror(errno)); exit(EXIT_FAILURE); } fprintf(stderr, "MC: START LOOP\n"); for (;;) { if ((cnt = recvfrom(s_mc, (void *)&buf, sizeof(buf), 0, (struct sockaddr *) &addr, (socklen_t *)&addrlen)) == -1) { if (errno != EWOULDBLOCK) { fprintf(stderr, "client: Multicast recvfrom() fail. %s\n", strerror(errno)); exit(EXIT_FAILURE); } } if (cnt != -1) { fprintf(stderr, "MC: %d %s\n", sizeof(buf), buf); } } }