The contents of this page are licensed under the following license
BSD Sockets

UDP Client
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUF_SIZE 1024

int main(int argc, char* argv[])
{
   int nSocket;
   int nConnect;
   int nBytes;
   int nBind;
   int nTmp;
   struct sockaddr_in stServerAddr, stMyAddr;
   struct hostent* lpstServerEnt;
   char cbBuf[BUF_SIZE];

   if (argc != 3)
   {
     fprintf(stderr, "Usage: %s server_name port_number\n", argv[0]);
     exit(1);
   }

   /* look up server's IP address */
   lpstServerEnt = gethostbyname(argv[1]);
   if (! lpstServerEnt)
   {
      fprintf(stderr, "%s: Can't get the server's IP address.\n", argv[0]);
      exit(1);
   }

   /* create a socket */
   nSocket = socket(PF_INET, SOCK_DGRAM, 0);
   if (nSocket < 0)
   {
      fprintf(stderr, "%s: Can't create a socket.\n", argv[0]);
      exit(1);
   }

   /* client info */
   memset(&stMyAddr, 0, sizeof(struct sockaddr));
   stMyAddr.sin_family = AF_INET;
   stMyAddr.sin_addr.s_addr = INADDR_ANY;
   stMyAddr.sin_port = 0;

   /* server info */
   memset(&stServerAddr, 0, sizeof(struct sockaddr));
   stServerAddr.sin_family = AF_INET;
   memcpy(&stServerAddr.sin_addr.s_addr, lpstServerEnt->h_addr, lpstServerEnt->h_length);
   stServerAddr.sin_port = htons(atoi(argv[2]));

   /* bind client name to a socket */
   nBind = bind(nSocket, (struct sockaddr*)&stMyAddr, sizeof(struct sockaddr));
   if (nBind < 0)
   {
       fprintf(stderr, "%s: Can't bind a name to a socket.\n", argv[0]);
       exit(1);
   }

   /* send a data to a server */
   strcpy(cbBuf, "Hello server!\n");
   sendto(nSocket, cbBuf, strlen(cbBuf)+1, 0, (struct sockaddr*)&stServerAddr,
          sizeof(struct sockaddr));

   /* receive a data from a server */
   nTmp = sizeof(struct sockaddr);
   nBytes = recvfrom(nSocket, cbBuf, BUF_SIZE, 0, (struct sockaddr*)&stServerAddr, &nTmp);
   printf("%s:: %s", argv[0], cbBuf);

   close(nSocket);
   return 0;
}

UDP Server
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SERVER_PORT 1234
#define QUEUE_SIZE 5
#define BUF_SIZE 1024

int main(int argc, char* argv[])
{
   int nSocket;
   int nBind;
   int nFoo = 1, nTmp;
   struct sockaddr_in stMyAddr, stClientAddr;
   char cbBuf[BUF_SIZE];

   /* address structure */
   memset(&stMyAddr, 0, sizeof(struct sockaddr));
   stMyAddr.sin_family = AF_INET;
   stMyAddr.sin_addr.s_addr = htonl(INADDR_ANY);
   stMyAddr.sin_port = htons(SERVER_PORT);

   /* create a socket */
   nSocket = socket(AF_INET, SOCK_DGRAM, 0);
   if (nSocket < 0)
   {
       fprintf(stderr, "%s: Can't create a socket.\n", argv[0]);
       exit(1);
   }
   setsockopt(nSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&nFoo, sizeof(nFoo));

   /* bind a name to a socket */
   nBind = bind(nSocket, (struct sockaddr*)&stMyAddr, sizeof(struct sockaddr));
   if (nBind < 0)
   {
       fprintf(stderr, "%s: Can't bind a name to a socket.\n", argv[0]);
       exit(1);
   }

   while(1)
   {
       /* receive a data from a client */
       nTmp = sizeof(struct sockaddr);
       recvfrom(nSocket,cbBuf, BUF_SIZE, 0, (struct sockaddr*)&stClientAddr, &nTmp);
       printf("%s:: %s", argv[0], cbBuf);

       /* send a data to a client */
       strcpy(cbBuf, "Hello client!\n");
       sendto(nSocket, cbBuf, strlen(cbBuf)+1, 0, (struct sockaddr*)&stClientAddr, nTmp);
   }

   close(nSocket);
   return(0);
}

August, 23rd 2006 © Michał Kalewski