int main()
{
    char    fitsHeader[FITS_HEADER_SIZE]; //FITS HEADER
    int     socketUCCI, sockWait;         //SOCKET DESCRIPTOR
    struct  sockaddr_in sin;              //BORDEL POUR SOCKET
    struct  sockaddr_in pin;
    int     addrLen;
    char    *ack;
    int     received = 0;
    int     received2 = 0;

    //Allocate message memory
    ack = calloc(ACKNOWLEDGE_SIZE, sizeof(char));
    if (ack == NULL)
    {
        printf("FATAL ERROR:\tCALLOC ERROR\n");
        exit(FAILURE);
    }
            
    //Get a internet socket
    if ((socketUCCI = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror("FATAL ERROR:\tSOCKET UCCI");
        exit(FAILURE);
    }

    //Complete the socket structure
    bzero(&sin, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_port = htons(PORT);

    //bind the socket
    if (bind(socketUCCI,(const struct sockaddr *)&sin, sizeof(sin)) == -1)
    {
        perror("FATAL ERROR:\tBIND SOCKETUCCI: ");
        close(socketUCCI);
        exit(FAILURE);
    }
    
    //Listen the socket
    if (listen(socketUCCI, 1) == -1)
    {
        perror("FATAL ERROR:\tLISTEN SOCKETUCCI: ");
        close(socketUCCI);
        exit(FAILURE);
    }

    while(1)
    {
        //Wait for a client
        if ((sockWait = accept(socketUCCI,(struct sockaddr *) &pin,
                               &addrLen)) == -1)
        {
            perror("FATAL ERROR:\tACCEPTING CONNECTION: ");
            close(socketUCCI);
            exit(FAILURE);
        }
        //Initialize reception buffer
        memset (fitsHeader,0,sizeof(fitsHeader)); 

        //Get the message from the client
        if((received = recv(sockWait, fitsHeader, FITS_HEADER_SIZE,
                            MSG_PEEK)) == -1)
        {
            perror("FATAL ERROR:\tRECEIVING DATA: ");
            close(socketUCCI);
            close(sockWait);
            exit(FAILURE);
        }

        //Check if the transmission is ended
        // ********* HOME MADE POLLING ************
        received2 = received+1;
        while (received2 > received)
        {
            received = received2;
            usleep(3*WCOM);
            if((received2 = recv(sockWait, fitsHeader, FITS_HEADER_SIZE,
                                 MSG_PEEK)) == -1)
            {
                perror("FATAL ERROR:\tRECEIVING DATA: ");
                close(socketUCCI);
                close(sockWait);
                exit(FAILURE);
            }
        }

        if((received = recv(sockWait, fitsHeader, FITS_HEADER_SIZE,0)) == -1)
        {
            perror("FATAL ERROR:\tRECEIVING DATA: ");
            close(socketUCCI);
            close(sockWait);
            exit(FAILURE);
        }
        
        fitsHeader[received] = NULL;

        //Return an aknowledge of reception
        strcpy(ack,ACKNOLEDGE_RECEPTION);
        if (send(sockWait, ack, strlen(ack), 0) == -1)
        {
            perror("FATAL ERROR:\tSENDING DATA: ");
            close(socketUCCI);
            close(sockWait);
            exit(FAILURE);
        }

        //Process received data
        usleep(WCOM);
        if (processData(fitsHeader) ==  FAILURE)
        {
            //Return an aknowledge of FAILURE
            strcpy(ack,ACKNOLEDGE_EXECUTION_ERR);
        }
        else
        {
            //Return an aknowledge of FAILURE
            strcpy(ack,ACKNOLEDGE_EXECUTION_OK);
        }

        //Send Acknowledge
        if (send(sockWait, ack, strlen(ack), 0) == -1)
        {
            perror("FATAL ERROR:\tSENDING DATA: ");
            close(socketUCCI);
            close(sockWait);
            exit(FAILURE);
        }
        
        close(sockWait);
        usleep(WCOM);
    }
    close(socketUCCI);
    return SUCCESS;
}

