gtpc1m71Transmission Control Protocol/Internet Protocol

Transmission Control Protocol (TCP) Client

/******************************************************************/
/* This is a stream socket client sample program that sends a     */
/* connect socket API request to the server program to bring up   */
/* the connection between the server and client.  The TCP server  */
/* also sends a message and receives an echo from the server.     */
/******************************************************************/
 
#include <tpfeq.h>
#include <tpfio.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <types.h>
#include <socket.h>
 
#define MAX_BUFFER_LEN        1024
#define NUM_PARAMETER         4
#define SEND_MSG_LEN          5
 
#define return_ok             0
#define return_error         -1
 
#define read_buffer           0
#define use_previous_buffer   1
 
qxyh(char *argv[], u_short num_arg)
{
  struct sockaddr_in client_sockaddr_in;
  struct sockaddr_in server_sockaddr_in;
 
  char *recv_client_message;
  char *send_client_message;
 
  short dest_portnum;
 
  int client_sock;
  int dest_address;
  int rc;
  int sockaddr_in_length;
 
  /**********************************************/
  /* Check the argument count.                  */
  /**********************************************/
 
  if (num_arg != NUM_PARAMETER)
  {
    printf("Invalid parameters :\n");
    printf("ztest sock client stream block <server IP addr> \
             <server port no.> <no. of msg> <msg size>\n");
    exit(0);
  }
 
  dest_address = inet_addr(argv[0]);
  dest_portnum = atoi(argv[1]);
 
  /*****************************************/
  /* Print out the client's parameter list.*/
  /*****************************************/
  printf("Parameter List :\n");
  printf("----------------------------------\n");
  printf("Dest address       = %x\n",dest_address);
  printf("Dest portnum       = %d\n",dest_portnum);
  printf("-----------------------------------\n\n");
 
  /***************************************/
  /* Initialize input/output buffer size.*/
  /***************************************/
  send_client_message = (char *)malloc(MAX_BUFFER_LEN);
  recv_client_message = (char *)malloc(MAX_BUFFER_LEN);
  sockaddr_in_length = sizeof(struct sockaddr_in);
 
  /**************************/
  /* Create a stream socket.*/
  /**************************/
  client_sock = socket(AF_INET,SOCK_STREAM,0);
  if (client_sock == return_error)
  {
    printf("Error in opening a stream socket\n");
    return(return_error);
  }
 
  /***************************************************************/
  /* Bind a local name to the socket. When using the IP routing  */
  /* table, this bind API should be skipped.                     */
  /***************************************************************/
  client_sockaddr_in.sin_family      = AF_INET;
  client_sockaddr_in.sin_port        = 0;
  client_sockaddr_in.sin_addr.s_addr = 0;
  rc = bind(client_sock,(struct sockaddr *)&client_sockaddr_in,
             sockaddr_in_length);
  if (rc == return_error)
  {
    printf("Error in binding - %d\n",sock_errno());
    rc = close(client_sock);
    exit(0);
  }
 
  /********************************/
  /* Print out client information.*/
  /********************************/
  printf("Client Information\n");
  printf("-----------------------------------\n");
  printf("Client sock = %d\n",client_sock);
  rc = getsockname(client_sock,(struct sockaddr *)&client_sockaddr_in,
                    &sockaddr_in_length);
  if (rc == return_ok)
  {
    printf("Client Address  =%x\n",client_sockaddr_in.sin_addr.s_addr);
    printf("Client Port No  = %d\n",client_sockaddr_in.sin_port);
  }
  printf("-----------------------------------\n\n");
 
  /*******************************************/
  /* Connect to a connection-oriented server.*/
  /*******************************************/
  server_sockaddr_in.sin_family      = AF_INET;
  server_sockaddr_in.sin_port        = dest_portnum;
  server_sockaddr_in.sin_addr.s_addr = dest_address;
  rc = connect(client_sock,(struct sockaddr *)&server_sockaddr_in,
                sockaddr_in_length);
  if (rc == return_error)
  {
    printf("Error in connecting - %d\n",sock_errno());
    rc = close(client_sock);
    exit(0);
  }
 
  printf("Server Information\n");
  printf("-----------------------------------\n");
  printf("Server Address  = %x\n",server_sockaddr_in.sin_addr.s_addr);
  printf("Server Port No  = %d\n",server_sockaddr_in.sin_port);
  printf("-----------------------------------\n\n");
 
  /*****************************/
  /* Send the server a message.*/
  /*****************************/
  (void)memset(send_client_message,'a',SEND_MSG_LEN - 1);
  *(send_client_message+SEND_MSG_LEN) = 0;
  rc = send(client_sock,send_client_message,SEND_MSG_LEN,0);
  if (rc == return_error)
  {
    printf("Error in sending message - %d\n",sock_errno());
    rc = close(client_sock);
    exit(0);
  }
  else
    printf("send msg = %s\n",send_client_message);
 
  /***************************************************************/
  /* Receive an echo message from the server.                    */
  /***************************************************************/
  rc = recv(client_sock,recv_client_message,MAX_BUFFER_LEN,0);
  if (rc == return_error)
  {
    printf("Error in receiving message - %d\n",sock_errno());
    rc = close(client_sock);
    exit(0);
  }
  else
    printf("recv msg = %s\n",recv_client_message);
 
  /************************************/
  /* Clean up the connection and exit */
  /************************************/
  rc = shutdown(client_sock,2);
  if (rc == return_error)
  {
    printf("Error in shutting down - %d\n",sock_errno());
  }
 
  rc = close(client_sock);
  if (rc == return_error)
  {
    printf("Error in closing the socket - %d\n",sock_errno());
    exit(0);
  }
 
  printf("Terminated communication normally-stream client\n");
  exit(0);
}