#include #include #include #include #include int main(int argc, char *argv[]) { int sock; int rc; struct sockaddr_in addr; struct ip_mreqn req; char buf[256]; struct pollfd fds; if (argc < 2) { printf("\nToo few arguments\n"); return 1; } sock = socket(PF_INET, SOCK_DGRAM, 0); printf("socket() -> %d(%d)\n", sock, errno); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.s_addr = INADDR_ANY; rc = bind(sock, (struct sockaddr*)&addr, sizeof(addr)); printf("bind() -> %d(%d)\n", rc, errno); memset((void *)&req, 0, sizeof(req)); rc = inet_aton(argv[1], &req.imr_multiaddr); printf("inet_aton() -> %d(%d)\n", rc, errno); req.imr_ifindex = atoi(argv[2]); rc = setsockopt(sock, SOL_IP, IP_ADD_MEMBERSHIP, &req, sizeof(req)); printf("setsockopt() -> %d(%d)\n", rc, errno); printf("Send packet to %s:12345 address...", argv[1]); getchar(); fds.fd = sock; fds.events = POLLIN; rc = poll(&fds, 1, 1000); printf("poll() -> %d(%d)\n", rc, errno); if (rc != 1) { printf("The packet was not received.\n"); return 1; } rc = recv(sock, buf, sizeof(buf), 0); printf("recv() -> %d(%d)\n", rc, errno); printf("Send packet to different multicast address(with 12345 port)..."); getchar(); rc = poll(&fds, 1, 1000); printf("poll() -> %d(%d)\n", rc, errno); if (rc != 0) { printf("The packet to different multicast address was received.\n"); rc = recv(sock, buf, sizeof(buf), 0); printf("recv() -> %d(%d)\n", rc, errno); return 1; } printf("The behaviour is correct\n"); return 0; }