#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>

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

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

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

  //////////////////////////////////////////////////////////////////////////
  // 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
    //
    char *data_buf = (char*)malloc(_packet_size);
    char *pbuf = (char *)data_buf;
    int len, i;

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

    sleep(1);

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

    printf("\n");
    free(data_buf);
  }

  exit(0);

  return 0;
}
