#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int main()
{
  // open server socket
  int srv_sock;       // server socket
  int cli_sock;       // client socket
  int result = 0;

  struct sockaddr_in srv_addr;   // local address
  struct sockaddr_in cli_addr;   // remote address

  // Construct local addr structure
  srv_addr.sin_family = AF_INET;
  srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);  // accept on any interface
  srv_addr.sin_port = htons(7000);

  // construct socket
  srv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (srv_sock < 1) {
    printf("Failed to create server socket\n");
    exit(1);
  }

  // bind
  result = bind(srv_sock, (struct sockaddr*) &srv_addr, sizeof(struct sockaddr_in));
  if (result < 0) {
    printf("Failed to bind server to address and port\n");
    exit(1);
  }

  // listen and enqueue at most 5 clients
  result = listen(srv_sock, 5);
  if (result < 0) {
    printf("Failed to start listening\n");
    exit(1);
  }

  // for getting data
  int received_bytes = 0;
  char received_string[512];

  //while(1)
  {
    // accept a connection
    // WARNING: must initialize this length or accept() won't fill the address struct.
    unsigned int sock_addr_len = sizeof(struct sockaddr);

    cli_sock = accept(srv_sock,
                      (struct sockaddr*)&cli_addr,
                      &sock_addr_len);
    printf("Connected to client socket %d\n", cli_sock);
    printf("                      len: %d\n", sock_addr_len);

    send(cli_sock, (const void *) "HELLO\n", 6, 0);
    printf(">>> Sent HELLO\n");

    received_bytes = recv(cli_sock, (void *)received_string, 512, 0);
    received_string[received_bytes] = '\0';
    printf("<<< Received: %s\n", received_string);

    printf("Closing connection to client %s\n", inet_ntoa(cli_addr.sin_addr));
    shutdown(cli_sock, SHUT_RDWR);
    close(cli_sock);
  }

  close(srv_sock);
}