Home » Programming » C » View Tutorial

C Tutorial: Socket Programming in C using UDP with Code

jawahar  Send Private Message
10/4/2005 2:40:59 PM, Views: 23042
W3Optimizer Online SEO. Top Search Engine Rankings
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;
}

Bookmark to: Yahoo Bookmark to: WinLive Bookmark to: Digg Bookmark to: Del.icio.us Bookmark to: Facebook Bookmark to: Reddit Bookmark to: Simpy Bookmark to: StumbleUpon Bookmark to: Slashdot Bookmark to: Propeller Bookmark to: Furl Bookmark to: Spurl Bookmark to: Google Bookmark to: Blinklist Bookmark to: Technorati Bookmark to: Newsvine Bookmark to: Blinkbits Bookmark to: Netvouz

Article Rating
Rating: 4 out of 5(17 votes)
Your Ad Here
Signup / Login To View the Solution or Provide Comments
Post your reply
Bold Italic Link Code Convert HTML tags

[bold] for <b> ; [/bold] for </b> ; [italic] for <i> ; [/italic] for </i> ; [code] & [/code] for code