gtpc1m72Transmission Control Protocol/Internet Protocol

User Datagram Protocol (UDP) Server

/**********************************************************/
/* This is a datagram socket server sample program.       */
/* When a message from the client program is received,    */
/* it echoes back the message to the client program.      */
/**********************************************************/
 
 
/**********************************************************/
/* TPF Standard Header Files                              */
/**********************************************************/
#include <tpfeq.h>
#include <tpfio.h>
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#include <types.h>
#include <socket.h>             /* Socket API Header File */
 
#define return_error         -1
 
qxyb()
{
  const message_size = 32 * 1024;
 
  struct sockaddr_in client_sockaddr_in;
  struct sockaddr_in server_sockaddr_in;
 
  char *recv_client_message;
  char *send_client_message;
 
  int echo_len;
  int optlen;
  int optval;
  int rc;
  int server_sock;
  int sockaddr_in_length;
 
  send_client_message = malloc(message_size);
  recv_client_message = malloc(message_size);
  sockaddr_in_length = sizeof(struct sockaddr_in);
 
  /****************************/
  /* Create a datagram socket.*/
  /****************************/
  server_sock = socket(AF_INET,SOCK_DGRAM,0);
  if (server_sock == return_error)
  {
    printf("Error in opening a datagram socket\n");
    exit(0);
  }
  printf("Host sock = %d\n",server_sock);
 
  /***********************************/
  /* Bind a local name to the socket.*/
  /***********************************/
  server_sockaddr_in.sin_family      = AF_INET;
  server_sockaddr_in.sin_port        = 5001;
  server_sockaddr_in.sin_addr.s_addr = INADDR_ANY;
  rc = bind(server_sock,(struct sockaddr *)&server_sockaddr_in,
            sockaddr_in_length);
  if (rc == return_error)
  {
    printf("Error in binding - %d\n",sock_errno());
    (void)close(server_sock);
    exit(0);
  }
 
  /******************************************************/
  /* Get the server information, and print its data out.*/
  /******************************************************/
  rc = getsockname(server_sock,(struct sockaddr *)&server_sockaddr_in,
                   &sockaddr_in_length);
  if (rc != return_error)
  {
    printf("Server Information\n");
    printf("--------------------------------\n");
    printf("Server sock       - %d\n",server_sock);
    printf("Server IP address - %x\n",
                                  server_sockaddr_in.sin_addr.s_addr);
    printf("Server port #     - %d\n\n",
                                  server_sockaddr_in.sin_port);
  }
 
  optval = message_size;
  optlen = sizeof(optval);
  rc = setsockopt(server_sock,SOL_SOCKET,SO_SNDBUF,(char *)&optval,
                  optlen);
  if (rc == return_error)
  {
    printf("Error in setsockopt - %d\n",sock_errno());
    (void)close(server_sock);
    exit(0);
  }
 
 
  printf(".... Ready for clients ....\n");
 
  /****************/
  /* Loop forever */
  /****************/
  for (;;)
  {
    /*******************************/
    /* Monitor incoming buffers.   */
    /*******************************/
    rc = recvfrom(server_sock,recv_client_message,message_size,0,
                  (struct sockaddr *)&client_sockaddr_in,
                  &sockaddr_in_length);
    if (rc == return_error)
    {
      printf("Error in receiving message - %d\n",sock_errno());
      break;
    }
    else
    {
      /******************************************************/
      /* Print out the client information and message length*/
      /* and then echo the same message back to that client.*/
      /******************************************************/
      echo_len = rc;
      (void)memcpy(send_client_message,recv_client_message,echo_len);
      rc = sendto(server_sock,send_client_message,echo_len,0,
                  (struct sockaddr *)&client_sockaddr_in,
                  sockaddr_in_length);
      if (rc == return_error)
        printf("Error in sending message to a client - %d\n",
               sock_errno());
    }
  }  /* end of for(;;) */
 
  /************************************************************/
  /* Return the socket back to the system and exit normally.  */
  /************************************************************/
  rc = close(server_sock);
  if (rc == return_error)
  {
    printf("Error in closing the socket - %d\n",sock_errno());
    printf("DATAGRAM NOAOR server terminated\n");
    exit(0);
  }
 
  printf("Datagram server terminated\n");
  exit(0);
}