FREE tutorial,solution,RSS Feeds on Operating Systems, Programming, Web Development, Applications, Databases, Networking, Hardware, Security, SEO Free Expertsforge Membership
Join us as Moderator
Submit Article to Expertsforge.com Submit Article My Expertsforge
 
RSS Feeds, Help Help RSS Feeds
bannertop
 

C Tutorial: Socket Programming in C - Simple multicast server.

jawahar
10/4/2005 1:15:53 AM, Views: 2441
To compile :

      * linux : gcc -Wall -o foo foo.c
      * solaris : gcc -Wall -o foo foo.c -lsocket -lnsl


1. IP multicast

      * multicast server : simple multicast server that prints received
messages.
         source : mcastServer.c
         usage : ./mcastServer multicast_group
      * multicast client : simple multicast client that sends data on
multicast group.
         source : mcastClient.c
         usage : ./mcastClient multicast_group data1 ... dataN

/********************* mcastServer.c ***********************/

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h> /* close */

#define SERVER_PORT 1500
#define MAX_MSG 100

int main(int argc, char *argv[]) {

   int sd, rc, n, cliLen;
   struct ip_mreq mreq;
   struct sockaddr_in cliAddr, servAddr;
   struct in_addr mcastAddr;
   struct hostent *h;
   char msg[MAX_MSG];

   if(argc!=2) {
      printf("usage : %s <mcast address>\n",argv[0]);
      exit(0);
   }

   /* get mcast address to listen to */
   h=gethostbyname(argv[1]);
   if(h==NULL) {
      printf("%s : unknown group '%s'\n",argv[0],argv[1]);
      exit(1);
   }
   
   memcpy(&mcastAddr, h->h_addr_list[0],h->h_length);
   
   /* check given address is multicast */
   if(!IN_MULTICAST(ntohl(mcastAddr.s_addr))) {
      printf("%s : given address '%s' is not multicast\n",argv[0],
       inet_ntoa(mcastAddr));
      exit(1);
   }

   /* create socket */
   sd = socket(AF_INET,SOCK_DGRAM,0);
   if(sd<0) {
      printf("%s : cannot create socket\n",argv[0]);
      exit(1);
   }

   /* bind port */
   servAddr.sin_family=AF_INET;
   servAddr.sin_addr.s_addr=htonl(INADDR_ANY);
   servAddr.sin_port=htons(SERVER_PORT);   
   if(bind(sd,(struct sockaddr *) &servAddr, sizeof(servAddr))<0) {
      printf("%s : cannot bind port %d \n",argv[0],SERVER_PORT);
      exit(1);
   }

   /* join multicast group */
   mreq.imr_multiaddr.s_addr=mcastAddr.s_addr;
   mreq.imr_interface.s_addr=htonl(INADDR_ANY);
   
   rc = setsockopt(sd,IPPROTO_IP,IP_ADD_MEMBERSHIP,
         (void *) &mreq, sizeof(mreq));
   if(rc<0) {
      printf("%s : cannot join multicast group '%s'",argv[0],
       inet_ntoa(mcastAddr));
      exit(1);
   }
   else {
      printf("%s : listening to mgroup %s:%d\n",
       argv[0],inet_ntoa(mcastAddr), SERVER_PORT);
   

      /* infinite server loop */
      while(1) {
         cliLen=sizeof(cliAddr);
         n = recvfrom(sd,msg,MAX_MSG,0,(struct sockaddr *) &cliAddr,&cliLen);
         if(n<n) {
   printf("%s : cannot receive data\n",argv[0]);
   continue;
         }

         printf("%s : from %s:%d on %s : %s\n",argv[0],
          inet_ntoa(cliAddr.sin_addr),ntohs(cliAddr.sin_port),
          argv[1],
          msg);
      }/* end of infinite server loop */

   }

return 0;

}

/********************* mcastClient.c ***********************/

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h> /* close */

#define SERVER_PORT 1500
#define MAX_MSG 100

int main(int argc, char *argv[]) {

   int sd, rc, i;
   unsigned char ttl = 1;
   struct sockaddr_in cliAddr, servAddr;
   struct hostent *h;

   if(argc<3) {
      printf("usage %s <mgroup> <data1> <data2> ... <dataN>\n",argv[0]);
      exit(1);
   }

   h = gethostbyname(argv[1]);
   if(h==NULL) {
      printf("%s : unknown host '%s'\n",argv[0],argv[2]);
      exit(1);
   }

   servAddr.sin_family = h->h_addrtype;
   memcpy((char *) &servAddr.sin_addr.s_addr,
h->h_addr_list[0],h->h_length);
   servAddr.sin_port = htons(SERVER_PORT);
   
   /* check if dest address is multicast */
   if(!IN_MULTICAST(ntohl(servAddr.sin_addr.s_addr))) {
      printf("%s : given address '%s' is not multicast \n",argv[0],
       inet_ntoa(servAddr.sin_addr));
      exit(1);
   }

   /* create socket */
   sd = socket(AF_INET,SOCK_DGRAM,0);
   if (sd<0) {
      printf("%s : cannot open socket\n",argv[0]);
      exit(1);
   }
   
   /* bind any port number */
   cliAddr.sin_family = AF_INET;
   cliAddr.sin_addr.s_addr = htonl(INADDR_ANY);
   cliAddr.sin_port = htons(0);
   if(bind(sd,(struct sockaddr *) &cliAddr,sizeof(cliAddr))<0) {
      perror("bind");
      exit(1);
   }

   if(setsockopt(sd,IPPROTO_IP,IP_MULTICAST_TTL, &ttl,sizeof(ttl))<0) {
      printf("%s : cannot set ttl = %d \n",argv[0],ttl);
      exit(1);
   }

   printf("%s : sending data on multicast group '%s' (%s)\n",argv[0],
    h->h_name,inet_ntoa(*(struct in_addr *) h->h_addr_list[0]));
   

   /* send data */
   for(i=2;i<argc;i++) {
      rc = sendto(sd,argv[i],strlen(argv[i])+1,0,
      (struct sockaddr *) &servAddr, sizeof(servAddr));
      
      if (rc<0) {
         printf("%s : cannot send data %d\n",argv[0],i-1);
         close(sd);
         exit(1);
      }

   }/* end for */

   /* close socket and exit */
   close(sd);
   exit(0);
}
Next Steps:
Add this Tutorial to:
Blink Blink del.icio.ous Del.icio.us Digg Digg
Fark Fark Furl Furl Google Google
Reddit Reddit Simpy Simpy Spurl Spurl
Technorati Technorati Windows Live Win Live Yahoo Yahoo
Rate Me!
Not Yet Rated!
Rate:
Send Private MessageSend Message
Signup / Login To View the Solution or Provide Comments
Post Comment/Solution
Comment:*
        (Link Rules) 
  Use : [bold] for <b>; [/bold] for </b>; [italic] for <i>; [/italic] for </i>; [code] & [/code] for code
 
Categories
Options
C RSS Feed
aachi_win
Most Popular Tutorial
Most Popular Solution
No Records!
Top Rated
Top Rankers
Overall
1. jawahar (150)
Yearly -2008
No Rankings!
Expertsforge Sponsors
bnrtop