UDP – Example – sending point to point messages

 

UDP allows sending individual packets over the IP protocol (just process demultiplication is done) to different applications running on different machines. Unlike TCP it does not support connections and streams. Each sendto operation

needs to be paired with a recvfrom.

UDP client

UDP Server

/* UDP client in the internet domain */

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <netdb.h>

#include <stdio.h>

 

void error(char *);

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

{

   int sock, length, n;

   struct sockaddr_in server, from; // IP Addressing(ip, port, type) Stuff

   struct hostent *hp; // DNS stuff

   char buffer[256];

 

   if (argc != 3) { printf("Usage: %s <server_name> <port>\n",argv[0]);

                    exit(1);

   }

   sock= socket(AF_INET, SOCK_DGRAM, 0);

   if (sock < 0) error("socket");

 

   server.sin_family = AF_INET;

   hp = gethostbyname(argv[1]);

   if (hp==0) error("Unknown host");

 

   bcopy((char *)hp->h_addr, (char *)&server.sin_addr, hp->h_length);

   server.sin_port = htons(atoi(argv[2]));

   length=sizeof(struct sockaddr_in);

  

   printf("Please enter the message: ");

   bzero(buffer,256);

   fgets(buffer,255,stdin);

   n=sendto(sock,buffer,strlen(buffer),0,&server,length);

   if (n < 0) error("Sendto");

  

   n = recvfrom(sock,buffer,256,0,&from, &length);

   if (n < 0) error("recvfrom");

   write(1,"Got an ack: ",12);

   write(1,buffer,n);

}

 

void error(char *msg)

{

    perror(msg);

    exit(0);

}

 

/* Creates a datagram server.  The port

   number is passed as an argument.  This

   server runs forever */

 

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#include <stdio.h>

 

void error(char *msg)

{

    perror(msg);

    exit(0);

}

 

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

{

   int sock, length, fromlen, n;

   struct sockaddr_in server;

   struct sockaddr_in from;

   char buf[1024];

 

   if (argc < 2) {

      fprintf(stderr, "ERROR, no port provided\n");

      exit(0);

   }

 

   sock=socket(AF_INET, SOCK_DGRAM, 0);

   if (sock < 0) error("Opening socket");

   length = sizeof(server);

   bzero(&server,length);

   server.sin_family=AF_INET;

   server.sin_addr.s_addr=INADDR_ANY;

   server.sin_port=htons(atoi(argv[1]));

 

   if (bind(sock,(struct sockaddr *)&server,length)<0)

       error("binding");

 

   fromlen = sizeof(struct sockaddr_in);

   while (1) {

       n = recvfrom(sock,buf,1024,0,(struct sockaddr *)&from,&fromlen);

       if (n < 0) error("recvfrom");

       write(1,"Received a datagram: ",21);

       write(1,buf,n);

       n = sendto(sock,"Got your message\n",17,

                  0,(struct sockaddr *)&from,fromlen);

       if (n  < 0) error("sendto");

   }

 }