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 using UDP with Code

jawahar
10/4/2005 1:10:59 AM, Views: 8310
UDP Socket Programming - Using C language

      * UDP server : simple UDP server that prints received messages.
         source : udpServer.c
         usage : ./udpServer
      * UDP client : simple UDP client that sends data to server.
         source : udpClient.c
         usage : ./udpClient server data1 ... dataN

To compile :

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

/*********************** udpserver.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() */
#include <string.h> /* memset() */

#define LOCAL_SERVER_PORT 1500
#define MAX_MSG 100

int main(int argc, char *argv[]) {
   
   int sd, rc, n, cliLen;
   struct sockaddr_in cliAddr, servAddr;
   char msg[MAX_MSG];

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

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

   printf("%s: waiting for data on port UDP %u\n",
       argv[0],LOCAL_SERVER_PORT);

   /* server infinite loop */
   while(1) {
      
      /* init buffer */
      memset(msg,0x0,MAX_MSG);


      /* receive message */
      cliLen = sizeof(cliAddr);
      n = recvfrom(sd, msg, MAX_MSG, 0,
       (struct sockaddr *) &cliAddr, &cliLen);

      if(n<0) {
         printf("%s: cannot receive data \n",argv[0]);
         continue;
      }
         
      /* print received message */
      printf("%s: from %s:UDP%u : %s \n",
       argv[0],inet_ntoa(cliAddr.sin_addr),
       ntohs(cliAddr.sin_port),msg);
      
   }/* end of server infinite loop */

return 0;

}

/*********************** udpclient.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>
#include <string.h> /* memset() */
#include <sys/time.h> /* select() */

#define REMOTE_SERVER_PORT 1500
#define MAX_MSG 100


int main(int argc, char *argv[]) {
   
   int sd, rc, i;
   struct sockaddr_in cliAddr, remoteServAddr;
   struct hostent *h;

   /* check command line args */
   if(argc<3) {
      printf("usage : %s <server> <data1> ... <dataN> \n", argv[0]);
      exit(1);
   }

   /* get server IP address (no check if input is IP address or DNS name */
   h = gethostbyname(argv[1]);
   if(h==NULL) {
      printf("%s: unknown host '%s' \n", argv[0], argv[1]);
      exit(1);
   }

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

   remoteServAddr.sin_family = h->h_addrtype;
   memcpy((char *) &remoteServAddr.sin_addr.s_addr,
    h->h_addr_list[0], h->h_length);
   remoteServAddr.sin_port = htons(REMOTE_SERVER_PORT);

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


   /* send data */
   for(i=2;i<argc;i++) {
      rc = sendto(sd, argv[i], strlen(argv[i])+1, 0,
      (struct sockaddr *) &remoteServAddr,
      sizeof(remoteServAddr));

      if(rc<0) {
         printf("%s: cannot send data %d \n",argv[0],i-1);
         close(sd);
         exit(1);
      }

   }
   return 1;
}
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
Rating Booth
Avg Visitor Rating: Average Visitor Rating is 3.5 out of 5
Number of Ratings : 12 Votes
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