#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h> 
#include <unistd.h>

int main(int argc, char **argv) {
  char* strAddr;
  unsigned short port;

  int sock;
  struct sockaddr_in addr;
  int reuse;

  /* validate number of arguments */
  if (argc != 3) {
    printf("Usage: %s [mcast group] [mcast port]\n", argv[0]);
    exit(1);
  }

  strAddr = argv[1];
  port = (unsigned short) atoi(argv[2]);

  /* create socket to join multicast group on */
  if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
    perror("Unable to open net socket");
    exit(1);
  }
  
  /* set reuse port to on to allow multiple binds per host */
  reuse = 1;
  if ((setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))) < 0) {
    perror("Unable to set port reuse flag");
    exit(1);
  }

  /* construct a multicast address structure */
  bzero(&addr, sizeof(addr));
  addr.sin_family      = AF_INET;
  addr.sin_addr.s_addr = inet_addr(strAddr);
  addr.sin_port        = htons(port);

  /* bind to multicast address to socket */
  if ((bind(sock, (struct sockaddr *) &addr, sizeof(addr))) < 0) {
    perror("bind() failed");
    exit(1);
  }

  printf("bind() succeeded\n");

  close(sock);

  return 0;
}

