#include <stdio.h>

#include <sys/types.h>
#include <sys/socket.h>

#include <netinet/in.h>

#include <pthread.h>

#define PORT 4242

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;

void *playmythread(void *ptr);


int main(void)
{
  int sockfd, clientfd;
  int r;
  struct sockaddr_in addr;
  socklen_t len;

  pthread_t thr;

  sockfd = socket(AF_INET, SOCK_STREAM, 0);

  addr.sin_family = AF_INET;
  addr.sin_port = htons(PORT);
  addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  bzero(addr.sin_zero, sizeof(addr.sin_zero));

  r = 1;
  if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&r,sizeof(int)) == -1) {
     perror("setsockopt");
     exit(-1);
  } 

  r = bind(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr));
  if (r == -1) {
    perror("bind");
    exit(-1);
  }

  listen(sockfd, 16);

  len = sizeof(struct sockaddr);
  while(clientfd = accept(sockfd, (struct sockaddr*)&addr, &len)) {
    printf("[ACCEPT] port %i\n", clientfd);

    pthread_mutex_lock(&mutex1);    
    thr = pthread_create(&thr, NULL, playmythread, (void*)&clientfd);

  }
  return (0);
}


void *playmythread(void *ptr)
{
  char buffer[4096];
  unsigned int i;
  int port;

  pthread_mutex_unlock(&mutex1);
  port = *(int*)ptr;

  printf("[UNLOCK] port %i (0x%.8x)\n", port, &port);

  i = recv(port, buffer, sizeof(buffer) - 1, 0);
  printf("[RECV] port %i data %i\n", port, i);
  send(port, buffer, i, 0);
  close(port);
  printf("[CLOSE] port %i\n", port);

  return(NULL);
}
