#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>

#define PACKET_SIZE 363    // Number of double values in packet

void usage()
{
  printf("Usage: server_test PORT\n");
}

int main( int argc, char **argv )
{
  short _server_port;
  int _servfd, _connfd;
  struct sockaddr_in _server_addr;
  struct timeval tv;

  if (argc != 2) {
    usage();
    exit(0);
  }
  _server_port = atoi(argv[1]);

  //////////////////////////////////////////////////////////////////////////
  // Create TCP server socket, bind and listen for connection
  //
  if ( (_servfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 ) {
    printf("server_test: can't create socket on port %d: %d",
	   _server_port, errno);
    exit(1);
  }

  memset((void*)&_server_addr, 0, sizeof(_server_addr));

  // Set up socket, bind, and listen
  //
  _server_addr.sin_family = AF_INET;
  _server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  _server_addr.sin_port        = htons(_server_port);

  if (bind(_servfd, (struct sockaddr*)&_server_addr, sizeof(_server_addr)) < 0) {
    printf("server_test: can't bind socket: %d", errno);
    exit(1);
  }

  printf("Server: Listen and accept\n");
  listen(_servfd, 10); 

  _connfd = accept(_servfd, (struct sockaddr*)NULL, NULL); 

  printf("Server: Got connection...\n");

  // Wait up to 15 seconds for request
  //
  tv.tv_sec = 15;
  tv.tv_usec = 0;

  setsockopt(_connfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));

  {
    ///////////////////////////////////////////////////////////////////////////
    // Get a request from client
    //
    double data_buf[PACKET_SIZE];
    char  *pbuf = (char *)data_buf;
    size_t buf_size = sizeof(data_buf);
    int len, i;

    for (len = 0; len < buf_size;)
      len += recv(_connfd, pbuf+len, buf_size-len, 0);

    sleep(1);

    // Take a look
    //
    printf("Server: Received %d bytes:\n", len);
    for (i = 0; i < PACKET_SIZE; i++)
      printf("%3.1f ", data_buf[i]);

    printf("\n");

    // Send a response
    //
    for (i = 0; i < 120; i++)
      data_buf[i] = i + 1;

    for (len = 0; len < buf_size;)
      len += send(_connfd, pbuf+len, buf_size-len, 0);
  }

  exit(0);

  return 0;
}
