#include #include #include #include #include #include #include #include #include #include #include #define IP_EN0 "192.168.0.101" #define IP_EN1 "192.168.1.101" #define IP_MCAST_GROUP "224.0.1.129" #define UDP_PORT 333 char packet[400] = { "dummy" }; static int s; /* this routine tests sending to a socket * which is bound to all interfaces */ int initTestAll(void) { unsigned char on = 0; struct sockaddr_in addr; struct ip_mreq imr; struct in_addr groupAddr; if( (s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) ) == -1 ) { printf("Could not create socket: %s\n",sys_errlist[errno]); return -1; } /* set non-blocking reads */ on = 1; if( -1 == ioctl (s, FIONBIO,(int) &on)) { printf("Could not set non-blocking reads: %s\n",sys_errlist[errno]); return -2; } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(UDP_PORT); if(bind(s, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) == -1) { printf("failed to bind event socket %s\n",sys_errlist[errno]); return -3; } imr.imr_interface.s_addr = htonl(INADDR_ANY); if( setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, (char *)&imr.imr_interface.s_addr, sizeof(struct in_addr)) == -1) { printf("failed to set multicast flag for interface: %s",sys_errlist[errno]); return -4; } if(!inet_aton(IP_MCAST_GROUP,&groupAddr)) { printf("could not convert address: %s\n",sys_errlist[errno]); return -5; } imr.imr_multiaddr.s_addr = groupAddr.s_addr; /* join multicast group (for receiving) on specified interface */ if( setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&imr, sizeof(struct ip_mreq)) == -1) { printf("failed to join multicast group: %s\n",sys_errlist[errno]); return -6; } return 0; } int initTestEn1(void) { unsigned char on = 0; struct sockaddr_in addr; struct ip_mreq imr; struct in_addr groupAddr,tmpAddr; if( (s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) ) == -1 ) { printf("Could not create socket: %s\n",sys_errlist[errno]); return -1; } /* set non-blocking reads */ on = 1; if( -1 == ioctl (s, FIONBIO,(int) &on)) { printf("Could not set non-blocking reads: %s\n",sys_errlist[errno]); return -2; } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; if(!inet_aton(IP_EN1,&tmpAddr)) { printf("could not convert address: %s\n",sys_errlist[errno]); return -10; } addr.sin_addr.s_addr = tmpAddr.s_addr; addr.sin_port = htons(UDP_PORT); if(bind(s, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) == -1) { printf("failed to bind event socket %s\n",sys_errlist[errno]); return -3; } imr.imr_interface.s_addr = tmpAddr.s_addr; if( setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, (char *)&imr.imr_interface.s_addr, sizeof(struct in_addr)) == -1) { printf("failed to set multicast flag for interface: %s",sys_errlist[errno]); return -4; } if(!inet_aton(IP_MCAST_GROUP,&groupAddr)) { printf("could not convert address: %s\n",sys_errlist[errno]); return -5; } imr.imr_multiaddr.s_addr = groupAddr.s_addr; /* join multicast group (for receiving) on specified interface */ if( setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&imr, sizeof(struct ip_mreq)) == -1) { printf("failed to join multicast group: %s\n",sys_errlist[errno]); return -6; } return 0; } int initTestEn0(void) { unsigned char on = 0; struct sockaddr_in addr; struct ip_mreq imr; struct in_addr groupAddr,tmpAddr; if( (s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) ) == -1 ) { printf("Could not create socket: %s\n",sys_errlist[errno]); return -1; } /* set non-blocking reads */ on = 1; if( -1 == ioctl (s, FIONBIO,(int) &on)) { printf("Could not set non-blocking reads: %s\n",sys_errlist[errno]); return -2; } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; if(!inet_aton(IP_EN0,&tmpAddr)) { printf("could not convert address: %s\n",sys_errlist[errno]); return -10; } addr.sin_addr.s_addr = tmpAddr.s_addr; addr.sin_port = htons(UDP_PORT); if(bind(s, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) == -1) { printf("failed to bind event socket %s\n",sys_errlist[errno]); return -3; } imr.imr_interface.s_addr = tmpAddr.s_addr; if( setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, (char *)&imr.imr_interface.s_addr, sizeof(struct in_addr)) == -1) { printf("failed to set multicast flag for interface: %s",sys_errlist[errno]); return -4; } if(!inet_aton(IP_MCAST_GROUP,&groupAddr)) { printf("could not convert address: %s\n",sys_errlist[errno]); return -5; } imr.imr_multiaddr.s_addr = groupAddr.s_addr; /* join multicast group (for receiving) on specified interface */ if( setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&imr, sizeof(struct ip_mreq)) == -1) { printf("failed to join multicast group: %s\n",sys_errlist[errno]); return -6; } return 0; } void idle() { struct timespec req,rem; req.tv_sec = 0; req.tv_nsec = 500000000; nanosleep(&req,&rem); } /* * check if we are able to send multicast packets * * @param interface_bound 0 bound to en0, 1 bound to en1, 2 bound to INADDR_ANY */ void sendTest(int interface_bound) { int i; struct in_addr tmp; struct sockaddr_in addr; switch (interface_bound) { case 0: if(initTestEn0()) { close(s); return; } break; case 1: if(initTestEn1()) { close(s); return; } break; case 2: if(initTestAll()) { close(s); return; } break; default: printf("don't know what todo\n"); } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(UDP_PORT); if(!inet_aton(IP_MCAST_GROUP,&tmp)) { printf("Could not convert address: %s\n",sys_errlist[errno]); close(s); return; } addr.sin_addr.s_addr = tmp.s_addr; for(i=0;i<20;i++) { if(sendto(s, packet, sizeof(packet), 0,(struct sockaddr *)&addr, sizeof(struct sockaddr)) < 0) { printf("error sending multicast message %s\n",sys_errlist[errno]); return; } idle(); } close(s); } /* * check if we are able to recive multicast packets * * @param interface_bound 0 bound to en0, 1 bound to en1, 2 bound to INADDR_ANY */ void receiveTest(int interface_bound) { int i; struct sockaddr_in addr; int addr_len = sizeof(struct sockaddr),len = 0; switch (interface_bound) { case 0: if(initTestEn0()) { close(s); return; } break; case 1: if(initTestEn1()) { close(s); return; } break; case 2: if(initTestAll()) { close(s); return; } break; default: printf("don't know what todo\n"); } for(i=0;i<20;i++) { len = recvfrom(s, packet, sizeof(packet), 0, (struct sockaddr *)&addr,(int *)&addr_len); if(len > 0) { printf("packet received with len %d \n",len); } idle(); } close(s); } int main(int argc, char *argv[]) { if(argc != 3) { printf("usage: %s <0|1|2>",argv[0]); } if(*argv[1] == 'r') { switch(*argv[2]) { case '0': case '1': case '2': receiveTest(atoi(argv[2])); break; default: printf("unknown parameter %s \n",argv[2]); break; } return EXIT_SUCCESS; } if(*argv[1] == 's') { switch(*argv[2]) { case '0': case '1': case '2': sendTest(atoi(argv[2])); break; default: printf("unknown parameter %s \n",argv[2]); break; } return EXIT_SUCCESS; } printf("unknown parameter %s \n",argv[1]); return EXIT_SUCCESS; }