Example #1
0
/**
 * Recoit les messages de la station 1
 */
void* receiveFrom1(void* arg)
{
    char buffer[BUFFER_SIZE];
    struct sockaddr_in addr;
    int v, sockRecv, addr_len, erreur = -1;
    
    initListen(&sockRecv, &addr, PORT_LISTEN_2_1);
    
    // Reception des donnees
    while(1) {
        addr_len = sizeof(addr);
        if ((v = recvfrom(sockRecv, buffer, BUFFER_SIZE, 0, (struct sockaddr *)&addr, &addr_len)) > 0) {
            printf("Recu de la station 1: %s\n", buffer);
            
            // Indique que la station 1 nous a donne une piece
            if(strcmp("DONNE_PIECE", buffer) == 0) {
                setPieceReceived(TRUE);
            }
        }
    }
}
Example #2
0
/**
 * Recoit les messages de la station 3
 */
void* receiveFrom3(void* arg)
{
    char buffer[BUFFER_SIZE];
    struct sockaddr_in addr;
    int v, sockRecv, addr_len, erreur = -1;
    
    initListen(&sockRecv, &addr, PORT_LISTEN_2_3);
    
    // Reception des donnees
    while(1) {
        addr_len = sizeof(addr);
        if ((v = recvfrom(sockRecv, buffer, BUFFER_SIZE, 0, (struct sockaddr *)&addr, &addr_len)) > 0) {
            printf("Recu de la station 3: %s\n", buffer);
            
            // Indique que la station 3 attend une piece
            if(strcmp("ATTEND_PIECE", buffer) == 0) {
            	printf("Station 3 attend piece\n");
                setCanGivePiece(TRUE);
            }
        }
    }
}
Example #3
0
/**
 * loopServer
 *
 * Boucle principale de l'entrée.
 * Création d'un serveur et écoute les connexions entrantes et stdin.
 * Si une connexion socket ou stdin est prêt à lire, appel de readFd
 */
void loopServer() {

    int port = -1;
    int socketServeur = -1; //le socket d'écoute de connexions
    if ((socketServeur = initSocket(&port)) == -1) {
        perror("Can't create socket");
        exit(EXIT_FAILURE);
    }

    DEBUG("[server] socket serveur fd=%d on port %d", socketServeur, port);

    printf("Listening on port %d\n", port);
    printPrompt(fileno(stdin));

    //Écoute

    fd_set socketsToRead; //la liste de socket à lire
    int maxSocket;        //le plus grand fd parmis socketsToRead
    initListen(socketServeur, &socketsToRead, &maxSocket);

    while (42) {

        fd_set readyToRead;
        selectSocket(&socketsToRead, &readyToRead, maxSocket);

        //On regarde la plage où se trouvent tous nos file descriptor
        for (int fd = 0; fd <= maxSocket; fd++) {

            if (FD_ISSET(fd, &readyToRead)) { //fd est prêt à être lu

                //une nouvelle connection sur le serveur
                if (fd == socketServeur) {
                    int sock = acceptConnection(fd, &socketsToRead, &maxSocket);
                    printPrompt(sock);
                } else { //Une entrée

                    DEBUG("[server] Reading input %d", fd);

                    int child = fork();

                    DEBUG("[server] Create child to handle connection %d", fd);
                    if (child ==0) { //dans le fils
                        setSigHandler(SIGINT_handler_nothing, SIGINT);
                        readInputServer(fd);
                        DEBUG("[worker] stop, connection end %d", fd);

                        if (fd == fileno(stdin)) {
                            //on informe le parent qu'il doit se terminer
                            DEBUG("tell parent to stop");
                            kill(getppid(), SIGUSR1);
                        } else {
                            dprintf(fd, "\nBye !\n");
                            close(fd);
                        }

                        exit(EXIT_SUCCESS);
                    } else { //dans le parent
                        //ne plus écouter ce socket
                        FD_CLR(fd, &socketsToRead);
                    }
                }
            }
        }

    }
}