blob: c325a2d02a1361b193d5b40c262eb96a8719dcce [file] [log] [blame]
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <time.h>
#include <netdb.h>
#define MAXBUFSIZ 8096
char buf[MAXBUFSIZ];
int Num_Loops=100;
int main(argc, argv)
int argc;
char *argv[];
{
struct ip_mreq imr;
struct sockaddr_in sin, mcast_out;
int i=0, s=0, n=0;
unsigned i1, i2, i3, i4, g1, g2, g3, g4;
struct hostent *hp, *gethostbyname();
char myname[64];
char ttl=0;
if (argc < 4) {
fprintf(stderr,
"usage: %s g.g.g.g interface_name (or i.i.i.i) port [ttl]\n",
argv[ 0]);
exit( 1);
}
/* Get local host name */
if (gethostname(myname, sizeof (myname) - 1) < 0) {
perror("gethostname");
exit(1);
}
/* set up multicast membership structure */
if ((n = sscanf(argv[1], "%u.%u.%u.%u", &g1, &g2, &g3, &g4)) != 4) {
fprintf(stderr, "bad group address\n" );
exit(1);
}
imr.imr_multiaddr.s_addr = htonl((g1<<24) | (g2<<16) | (g3<<8) | g4);
if ((hp = gethostbyname(argv[2]))) {
memcpy(&imr.imr_interface.s_addr, hp->h_addr, hp->h_length);
} else
if ((n = sscanf(argv[2], "%u.%u.%u.%u", &i1, &i2, &i3, &i4)) != 4) {
fprintf (stderr,"Bad interface address\n");
exit (1);
} else
imr.imr_interface.s_addr =
htonl((i1<<24) | (i2<<16) | (i3<<8) | i4);
/* Set up socket structure for sendto */
memset(&mcast_out, 0x00, sizeof(mcast_out));
memset(&sin, 0x00, sizeof(sin));
mcast_out.sin_family = sin.sin_family = AF_INET;
mcast_out.sin_port = sin.sin_port = htons(atoi(argv[3]));
mcast_out.sin_addr.s_addr = imr.imr_multiaddr.s_addr;
/* Create socket */
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror( "can not open socket" );
exit(1);
}
/* Set socket for multicasting */
if ( setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF,
&imr.imr_interface.s_addr, sizeof(imr.imr_interface.s_addr)) != 0 )
{
fprintf (stderr,
"Error: unable to set socket option IP_MULTICAST_IF\n");
exit (1);
}
/* With an even port number the loopback will be disabled */
/* loop = atoi(argv[3])&1;
if (setsockopt(s,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(char))!= 0) {
fprintf (stderr,
"Error: unable to set socket option IP_MULTICAST_LOOP\n");
exit (1);
}
*/
ttl = atoi(argv[4]);
if (setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) < 0)
{
perror("can not set ttl");
exit(1);
}
/* Send datagrams */
for (i=1;i < Num_Loops;i++) {
sprintf(buf, "%s %d %d", argv[2], i, (int)time(0));
if ((n = sendto(s, buf, sizeof(buf), 0, (struct sockaddr *) &mcast_out,
sizeof(mcast_out))) < 0) {
perror("setsockopt");
exit(1);
}
sleep (1);
}
/* Tell recevier to close */
sprintf(buf, "quit");
if ((n = sendto(s, buf, sizeof(buf), 0, (struct sockaddr *) &mcast_out,
sizeof(mcast_out))) < 0) {
perror("setsockopt");
exit(1);
}
close (s);
exit (0);
}