#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define BUF_LEN 256 #define MADDR "235.0.0.3" #define PORT 17000 int main(int argc, char *argv[]) { struct sockaddr_in sin; struct ip_mreq mreq; socklen_t sin_len; int sock_fd; char buf[BUF_LEN]; int bytes_received; int i; sock_fd = socket(AF_INET, SOCK_DGRAM, 0); if (sock_fd < 0) { perror("unable to open socket fd\n"); exit(1); } sin.sin_family = AF_INET; sin.sin_port = htons(PORT); sin.sin_addr.s_addr = INADDR_ANY; sin_len = sizeof(sin); if(bind(sock_fd, (struct sockaddr *)&sin, sin_len)) { perror("unable to bind socket\n"); close(sock_fd); exit(1); } mreq.imr_multiaddr.s_addr = inet_addr(MADDR); mreq.imr_interface.s_addr = INADDR_ANY; if(setsockopt(sock_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))) { perror("unable to add membership\n"); close(sock_fd); exit(1); } for (i = 0; i < 10; i++) { struct timespec sleeptime = { .tv_sec = 1, .tv_nsec = 0, }; printf("loop %d:\n", i); bytes_received = recvfrom(sock_fd, buf, BUF_LEN, 0, NULL, NULL); printf("\treceived %d bytes\n", bytes_received); nanosleep(&sleeptime, NULL); } setsockopt(sock_fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)); close(sock_fd); return 0; }