multithreading - Multicasting UDP in C -


i programming multicast environment scenario. source sending content multicast address 239.0.1.1. on other end client wants join multicast address. actual working of multicast client wants join multicast group sends join request router has connected. have program router operation receives multicast join request client, fetch data multicast address , give content customer. not able figure out how this. single user fine. when there multiple clients technique using not correct... please me out.. code join particular address , send data single client shown below:

#include <sys/types.h>  /* type definitions */ #include <sys/socket.h> /* socket api calls */ #include <netinet/in.h> /* address structs */ #include <arpa/inet.h>  /* sockaddr_in */ #include <stdio.h>      /* printf() , fprintf() */ #include <stdlib.h>     /* atoi() */ #include <string.h>     /* strlen() */ #include <unistd.h>     /* close() */  #define max_len  4074   /* maximum receive string size */ #define min_port 1024   /* minimum port allowed */ #define max_port 65535  /* maximum port allowed */   int main(int argc, char *argv[])  {    int sock;                     /* socket descriptor */   int flag_on = 1;              /* socket option flag */   struct sockaddr_in mc_addr;   /* socket address structure */   char recv_str[max_len+1];     /* buffer receive string */   int recv_len;                 /* length of string received */   struct ip_mreq mc_req;        /* multicast request structure */   char* mc_addr_str;            /* multicast ip address */   unsigned short mc_port;       /* multicast port */   //unsigned short mc_port1=1400;      /*multicast port */   struct sockaddr_in from_addr; /* packet source */   unsigned int from_len;        /* source addr length */   // send data client       int sockfd, newsockfd, portno;      socklen_t clilen;     struct sockaddr_in serv_addr, cli_addr;      int n;    int cnt;     int no=4096,i;   char *buffer[no];    int dest_sock;   struct sockaddr_in dest_addr;   char * dest_address="192.168.1.4";   unsigned int dest_port=5000;    /* validate number of arguments */   if (argc != 3)    {     fprintf(stderr,              "usage: %s <multicast ip> <multicast port>\n",              argv[0]);     exit(1);    }    mc_addr_str = argv[1];      /* arg 1: mlticast ip address */   mc_port = atoi(argv[2]);    /* arg 2: multicast port number */    /* validate port range */   if ((mc_port < min_port) || (mc_port > max_port)) {     fprintf(stderr, "invalid port number argument %d.\n",             mc_port);     fprintf(stderr, "valid range between %d , %d.\n",             min_port, max_port);     exit(1);   }    /* create socket join multicast group on */   if ((sock = socket(pf_inet, sock_dgram, ipproto_udp)) < 0) {     perror("socket() failed");     exit(1);   }   else    printf("socket connection successful\n");     /* set reuse port on allow multiple binds per host */   if ((setsockopt(sock, sol_socket, so_reuseaddr, &flag_on,        sizeof(flag_on))) < 0) {     perror("setsockopt() failed");     exit(1);   }     /* construct multicast address structure */   memset(&mc_addr, 0, sizeof(mc_addr));   mc_addr.sin_family      = af_inet;   mc_addr.sin_addr.s_addr = htonl(inaddr_any);   mc_addr.sin_port        = htons(mc_port);         /* bind multicast address socket */   if ((bind(sock, (struct sockaddr *) &mc_addr,         sizeof(mc_addr))) < 0) {     perror("bind() failed");     exit(1);   }    /* construct igmp join request structure */   mc_req.imr_multiaddr.s_addr = inet_addr(mc_addr_str);   mc_req.imr_interface.s_addr = htonl(inaddr_any);    /* send add membership message via setsockopt */   if ((setsockopt(sock, ipproto_ip, ip_add_membership,         (void*) &mc_req, sizeof(mc_req))) < 0) {     perror("setsockopt() failed");     exit(1);   } printf("setsocket successfull\n");  //for sending data client  //creating socket client , waiting client receive data     if ((dest_sock = socket(pf_inet, sock_dgram, ipproto_udp)) < 0) {    perror("socket() failed");   exit(1);   }   else    printf("socket connection successful\n");   if ((setsockopt(dest_sock, sol_socket, so_reuseaddr, &flag_on,      sizeof(flag_on))) < 0) {    perror("setsockopt() failed");    exit(1);   }      sockfd = socket(af_inet, sock_stream, 0);      if (sockfd < 0)          error("error opening socket");      bzero((char *) &serv_addr, sizeof(serv_addr));      portno = 5000;//atoi(argv[1]);     serv_addr.sin_family = af_inet;     serv_addr.sin_addr.s_addr = inaddr_any;     serv_addr.sin_port = htons(portno);     if (bind(sockfd, (struct sockaddr *) &serv_addr,      //         sizeof(serv_addr)) < 0)       //         error("error on binding");     // listen(sockfd,5);     // clilen = sizeof(cli_addr);     // newsockfd = accept(sockfd,                   //(struct sockaddr *) &cli_addr,       //          // &clilen);      //if (newsockfd < 0)     //  error("error on accept"); /*------------------------------------------------------------------------------------------------------*/   for(cnt=0;cnt<100;cnt++) {          /* loop forever */      /* clear receive buffers & structs */     memset(recv_str, 0, sizeof(recv_str));     from_len = sizeof(from_addr);     memset(&from_addr, 0, from_len);      /* block waiting receive packet */     //buffer[cnt]=recvfrom(sock, recv_str, max_len, 0,(struct sockaddr*)&from_addr, &from_len);    // no++;     if ((recv_len = recvfrom(sock, recv_str, max_len, 0,(struct sockaddr*)&from_addr, &from_len)) < 0)      //if(strlen(buffer[cnt])<0)      {             perror("recvfrom() failed");             exit(1);         }      /* output received string */    // printf("received %d bytes %s: ", recv_len, inet_ntoa(from_addr.sin_addr));     printf("\n");     //printf("%s\n",recv_str);         //printf("\n");     //buffer[i]=recv_str;     //printf("%s\n",buffer[i]);     //printf("enter writing mode\n");     n = write(newsockfd,recv_str,sizeof(recv_str));     i++;     //printf("%d\n",n);        if (n < 0)      {     error("error writing socket");     exit(1);     }         i++;       //return 0;     }    close(newsockfd);    close(sockfd);   /* send drop membership message via setsockopt */   if ((setsockopt(sock, ipproto_ip, ip_drop_membership,         (void*) &mc_req, sizeof(mc_req))) < 0) {     perror("setsockopt() failed");      exit(1);   }   close(sock);  } 

it sounds you're trying implement multicast router, xorp.

the source xorp dense, igmpproxy has functionality sounds similar you're after, without heap of other functionality don't need.


Comments

Popular posts from this blog

linux - Using a Cron Job to check if my mod_wsgi / apache server is running and restart -

actionscript 3 - TweenLite does not work with object -

jQuery Ajax Render Fragments OR Whole Page -