/** * 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); } } } }
/** * 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); } } } }
/** * 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); } } } } } }