blob: 55d60078c4fa2c5ce5e338aa72b006f48bb77a19 [file] [log] [blame]
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <netdb.h>
#define MAXBUFSIZ 8096
char buff[MAXBUFSIZ];
int errors=0;
int
main(argc, argv)
int argc;
char *argv[];
{
int s;
struct in_addr gimr;
struct ip_mreq simr;
unsigned i1, i2, i3, i4;
struct hostent *hp, *gethostbyname();
char sintf[20], gintf[20];
int n=0;
unsigned char ttl;
char loop=0;
unsigned int len=0;
if (argc != 2) {
fprintf(stderr,
"usage: %s interface_name (or i.i.i.i)\n",
argv[ 0]);
exit( 1);
}
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror( "Error: can't open socket" );
exit(1);
}
printf("agrv sub 1 is %s\n", argv[1]);
if ((hp = gethostbyname(argv[1])))
memcpy(&simr.imr_interface.s_addr, hp->h_addr, hp->h_length);
else
if ((n = sscanf(argv[1], "%u.%u.%u.%u", &i1, &i2, &i3, &i4)) != 4) {
fprintf(stderr,"Bad interface address\n");
exit(1);
} else
simr.imr_interface.s_addr =
htonl((i1<<24) | (i2<<16) | (i3<<8) | i4);
strcpy(sintf, inet_ntoa(simr.imr_interface));
/* verify socket options */
if ( setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF,
&simr.imr_interface.s_addr,
sizeof(simr.imr_interface.s_addr)) != 0 )
{
perror ("Error: Setting IP_MULTICAST_IF");
errors++;
}
else
printf("Set interface: %s for multicasting\n", sintf);
len = sizeof(gimr);
if (getsockopt(s,IPPROTO_IP,IP_MULTICAST_IF,&gimr,(socklen_t*)&len)!= 0) {
perror ("Getting IP_MULTICAST_IF");
errors++;
}
else {
strcpy(gintf, inet_ntoa(gimr));
printf("Got multicasting socket interface: %s\n",gintf);
}
/* Verify that the multicastion for the interface was set */
if (strcmp (sintf, gintf) != 0) {
printf ("Error: IP_MULTICAST_IF was not set\n");
errors++;
}
else
printf ("Socket has been set for multicasting on interface: %s\n",
sintf);
len = sizeof(ttl);
if (getsockopt(s,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,(socklen_t*)&len) != 0) {
perror ("Error: Gettting IP_MULTICAST_TTL");
errors++;
}
else
printf ("getsockopt: got ttl = %i\n",ttl);
if (ttl != 1)
printf ("Error: IP_MULTICAST_TTL not default value, ttl = %i\n",ttl );
ttl = 10; /* Set ttl to 10 */
len = sizeof (ttl);
if (setsockopt(s,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl)) != 0)
{
perror ("Error: Setting IP_MULTICAST_TTL");
errors++;
}
else
printf ("TTL set on multicast socket\n");
if (getsockopt(s,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,(socklen_t*)&len) != 0) {
perror ("Error: Getting IP_MULTICAST_TTL");
errors++;
}
if (ttl != 10) {
printf ("Error: IP_MULTICAST_TTL not set, ttl = %i\n",ttl);
errors++;
}
len = sizeof (loop);
if (getsockopt(s,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,(socklen_t*)&len) != 0) {
perror ("Error: Getting IP_MULTICAST_LOOP");
errors++;
} else
printf ("Got loopback setting\n");
if (loop != 1) {
printf ("Error: IP_MULTICAST_LOOP not enabled, loop = %i\n",loop);
errors++;
} else
printf ("IP_MULTICAST_LOOP is enabled\n");
loop = 0; /* Disable IP_MULTICAST_LOOP */
if (setsockopt(s,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(char)) != 0)
{
errors++;
perror ("Error: Setting IP_MULTICAST_LOOP");
} else
printf ("Multicast loopback disabled\n");
if (getsockopt(s,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,(socklen_t*)&len) != 0) {
perror ("Error: Getting IP_MULTICAST_LOOP");
errors++;
} else
printf ("Got multicast loopback value\n");
if (loop != 0) {
printf ("Error: IP_MULTICAST_LOOP not disabled, loop = %i\n",loop);
errors++;
} else
printf ("IP_MULTICAST_LOOP disabled\n");
close (s);
if (errors)
exit (1);
exit (0);
}