/* client.c */

#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <strings.h>
#include <unistd.h>

#define BUFFER_SIZE 1024

int main()
{
  /* create TCP client socket (endpoint) */
  int sock = socket( PF_INET, SOCK_STREAM, 0 );

  if ( sock < 0 )
  {
    perror( "socket() failed" );
    exit( EXIT_FAILURE );
  }

  struct hostent * hp = gethostbyname( "linux01.cs.rpi.edu" );
  if ( hp == NULL )
  {
    perror( "gethostbyname() failed" );
    exit( EXIT_FAILURE );
  }

  struct sockaddr_in server;
  server.sin_family = PF_INET;
  memcpy( (void *)&server.sin_addr, (void *)hp->h_addr,
          hp->h_length );
  unsigned short port = 8127;
  server.sin_port = htons( port );

  printf( "server address is %s\n", inet_ntoa( server.sin_addr ) );

  if ( connect( sock, (struct sockaddr *)&server,
                sizeof( server ) ) < 0 )
  {
    perror( "connect() failed" );
    exit( EXIT_FAILURE );
  }

  char * msg = "hello world";
  int n = write( sock, msg, strlen( msg ) );
fflush( NULL );
  if ( n < strlen( msg ) )
  {
    perror( "write() failed" );
    exit( EXIT_FAILURE );
  }

  char buffer[ BUFFER_SIZE ];
  n = read( sock, buffer, BUFFER_SIZE );  // BLOCK
  if ( n < 0 )
  {
    perror( "read() failed" );
    exit( EXIT_FAILURE );
  }
  else
  {
    buffer[n] = '\0';
    printf( "Received message from server: %s\n", buffer );
  }

  close( sock );

  return EXIT_SUCCESS;
}