diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2007-09-19 21:52:02 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2007-09-19 21:52:02 +0000 |
commit | 046d88cc0163bf6828beef043f011acdd9c43426 (patch) | |
tree | 1d4efdb6bba1768d1ccb802b2e4c3391c6c07051 /mcast/listener.c | |
parent | 2007-09-14 Joel Sherrill <joel.sherrill@oarcorp.com> (diff) | |
download | network-demos-046d88cc0163bf6828beef043f011acdd9c43426.tar.bz2 |
2007-09-19 Joel Sherrill <joel.sherrill@oarcorp.com>
* ChangeLog, Makefile, README, init.c, listener.c, mcast.c,
mcast_params.h, mcast_route.c, rootfs/etc/host.conf,
rootfs/etc/hosts: New files.
Diffstat (limited to 'mcast/listener.c')
-rw-r--r-- | mcast/listener.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/mcast/listener.c b/mcast/listener.c new file mode 100644 index 0000000..5daa6c4 --- /dev/null +++ b/mcast/listener.c @@ -0,0 +1,84 @@ +/* + * listener.c -- joins a multicast group and echoes all data it receives from + * the group to its stdout... + * + * Antony Courtney, 25/11/94 + * Modified by: Frédéric Bastien (25/03/04) + * to compile without warning and work correctly + * + * http://ntrg.cs.tcd.ie/undergrad/4ba2/multicast/antony/example.html + */ + +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <time.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> + +#include "mcast_params.h" + +#define HELLO_PORT MCAST_PORT +#define HELLO_GROUP MCAST_ADDR + +#define MSGBUFSIZE 256 + +main(int argc, char *argv[]) +{ + struct sockaddr_in addr; + int fd, nbytes,addrlen; + struct ip_mreq mreq; + char msgbuf[MSGBUFSIZE]; + + u_int yes=1; /*** MODIFICATION TO ORIGINAL */ + + /* create what looks like an ordinary UDP socket */ + if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) { + perror("socket"); + exit(1); + } + + +/**** MODIFICATION TO ORIGINAL */ + /* allow multiple sockets to use the same PORT number */ + if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0) { + perror("Reusing ADDR failed"); + exit(1); + } +/*** END OF MODIFICATION TO ORIGINAL */ + + /* set up destination address */ + memset(&addr,0,sizeof(addr)); + addr.sin_family=AF_INET; + addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */ + addr.sin_port=htons(HELLO_PORT); + + /* bind to receive address */ + if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0) { + perror("bind"); + exit(1); + } + + /* use setsockopt() to request that the kernel join a multicast group */ + mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP); + mreq.imr_interface.s_addr=htonl(INADDR_ANY); + if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0) { + perror("setsockopt"); + exit(1); + } + + /* now just enter a read-print loop */ + while (1) { + addrlen=sizeof(addr); + if ((nbytes=recvfrom(fd,msgbuf,MSGBUFSIZE,0, + (struct sockaddr *) &addr,&addrlen)) < 0) { + perror("recvfrom"); + exit(1); + } + puts(msgbuf); + } +} + + |