#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>  //strlen
#include <arpa/inet.h>  //inet_addr
#include <unistd.h>  //write
#include <pthread.h>

#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 8888

void *connection_handler(void *);

int main(int argc , char *argv[])
{
    int socket_desc, new_socket, c, *new_sock;
    struct sockaddr_in server, client;
    pthread_t sniffer_thread;

    //Create socket
    socket_desc = socket(AF_INET, SOCK_STREAM, 0);
    
    //Sockaddr struct
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons (SERVER_PORT);

    //bind socket to a port
    bind(socket_desc, (struct sockaddr *)&server, sizeof(server));
    //puts("bind done");

    //listen, max 20 connections
    listen(socket_desc,20);

    //Accept and incoming connection
    puts("waiting for incoming connection...");
    c = sizeof(struct sockaddr_in);
    while(new_socket = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c))
    //while(1)
    {
        new_sock = malloc(1);
        *new_sock = new_socket;
        pthread_create(&sniffer_thread, NULL, connection_handler, (void*)new_sock);
    }
    //close(socket_desc);
    return 0;
}

void *connection_handler(void *socket_desc)
{
    int sock = *(int*)socket_desc;
    int sendback_nu;
    char *message, client_message[3];

    read(sock, client_message, strlen(client_message));
    puts(client_message);
    printf("client_message = %s \r\n",client_message);
    int temp_nu = atoi(client_message);
    char text[5];
    
    puts("this is a thread message");
    sendback_nu = temp_nu * 100 + 5;
    sprintf(text,"%d",sendback_nu);
    message = text;

    write(sock, message, strlen(message));
    puts("send back");
    puts(message);
    free(socket_desc);
    return 0;
}