#include #include #include #include #include #include #define TEST_PORT 12345 #define BUFSIZE 512 #define USAGE_STMT "Usage: argv[0]
\n" int main(int argc, char* argv[]) { int i, s, duh; struct sockaddr_in saddr; char buf[BUFSIZE]; struct ip_mreq mreq; if (argc != 2) { printf(USAGE_STMT); return -1; } if((s = socket(PF_INET, SOCK_DGRAM, 0)) == -1) { printf("argv[0]: cannot get socket descriptor\n"); return -1; } saddr.sin_family = AF_INET; saddr.sin_port = htons(TEST_PORT); saddr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(s, &saddr, sizeof(struct sockaddr_in)) == -1) { printf("%s: could not name socket\n", argv[0]); return -1; } if(inet_aton(argv[1], &(mreq.imr_multiaddr)) == 0) { printf("You have specified an invalid address to join.\n"); return -1; } if(inet_aton("192.168.1.7", &(mreq.imr_interface)) == 0) { printf("You have specified an invalid interface address.\n"); return -1; } setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(struct ip_mreq)); memset(&saddr, 0, sizeof(struct sockaddr_in)); duh = sizeof(struct sockaddr_in); while (recvfrom(s, buf, BUFSIZE, 0, &saddr, &duh) > 0) { printf("%s says: %s\n", inet_ntoa(saddr.sin_addr.s_addr), buf); memset(&saddr, 0, sizeof(struct sockaddr_in)); } }