C Client

The following C code is an example for an ONLINE client. It can be started after an ONLINE session prepared for a connect with, e.g. server/asynch.

/*
  Compile with: 

  gcc -o client client.c

  Usage, e.g.: 

  ./client -hhasexp -p7777
*/
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <ctype.h>
#include <netdb.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>

int read_fd( int s, char *buffer, int len_max); 
int trim( char *); 

main( int argc, char *arg[])
{
  int s, i;
  char buffer[1000];
  int len_max = 1000;
  struct sockaddr_in sin;
  struct hostent *hp;
  struct servent *sp;
  fd_set fdset;

  char host_name[80]; 
  int port_no; 
  
  strcpy( host_name, "hasXXX.desy.de"); 
  port_no = 7777; 

  if( argc > 1)
    {
      for( i=1; i < argc; i++)
        {
          if( arg[i][0] != '-')
            {
              continue; 
            }
          switch( toupper( arg[i][1]))
            {
            case '?':
              fprintf( stdout, "\n Usage:\n\n");
              fprintf( stdout, "  -? Help \n");
              fprintf( stdout, "  -hhostname \n");
              fprintf( stdout, "  -pport_no \n");
              goto finish;
            case 'H':
              strcpy( host_name, arg[i] + 2); 
              break;
            case 'P':
              port_no = atoi( arg[i] + 2);
              break;
            }
        }
    }
  fprintf( stdout, 
           " Connecting to %s port %d until 'bye'\n", host_name, port_no); 

  if( (hp = gethostbyname( host_name)) == 0)
    {
      fprintf(stderr, "host %s  unknown\n", host_name);
      goto finish;
    }
  
  if( (s = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0)
    {
      fprintf( stderr, " socket: %s \n", strerror( errno));
      goto finish;
    }

  bcopy(hp->h_addr, &sin.sin_addr, hp->h_length);
  sin.sin_family = AF_INET;
  sin.sin_port = htons(port_no);
  
  if ( connect(s, (struct sockaddr *) &sin, sizeof (sin)) < 0) 
    {
      fprintf( stderr, " Connect: %s \n", strerror( errno));
      goto finish;
    }

  FD_ZERO( &fdset );
  FD_SET( s , &fdset );
  
  while( 1)
    {
      i = read( fileno( stdin), buffer, len_max); 
      buffer[i] = 0;
      trim( buffer); 
      if( !strcasecmp( buffer, "BYE"))
        {
          goto finish;
        }

      send(s, buffer, strlen(buffer), 0);
      if( !strcmp( buffer, "bye"))
        {
          break;
        }
      if(select( 32, &fdset, 0 , 0 , 0))
        {
          i = recv(s , buffer, len_max , 0 );
          buffer[i] = 0;
          printf( "Reply: %s", buffer); 
        }
    }

 finish:
  exit(0);
}
/*
  remove leading and trailing white space
*/
int trim( char *buffer)
{
  char cuffer[1000]; 
  int i; 

  while( buffer[ strlen( (const char*) buffer) - 1] <= ' ')
    {
      buffer[ strlen(buffer) - 1] = 0;
    }

  strcpy( cuffer, buffer); 

  for( i = 0; i < strlen((const char*) buffer); i++)
    {
      if( buffer[i] > ' ')
        {
          break;
        }
    }
  strcpy( cuffer, buffer + i);
  strcpy( buffer, cuffer); 
}