1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <pthread.h>
#include <string.h>
/* Fonction permettant de créer un serveur tcp */
int create_tcp_server (int port, int nb_max_clients){
/* Le socket d'écoute */
int s_ecoute ;
struct sockaddr_in serv_addr ;
/* on désigne l'adresse + port qu'on va ouvrir */
serv_addr.sin_family = AF_INET ;
serv_addr.sin_addr.s_addr = htonl (INADDR_ANY) ; /* on attend sur toutes nos adresses */
serv_addr.sin_port = htons (port) ;
memset (&serv_addr.sin_zero, 0, sizeof(serv_addr.sin_zero));
/* on crée la socket d'ecoute et on l'associe au couple (adresse,port) defini ci-dessus */
s_ecoute = socket (PF_INET, SOCK_STREAM, 0) ;
bind (s_ecoute, (struct sockaddr *)&serv_addr, sizeof serv_addr) ;
listen (s_ecoute, 5) ; /* on definit la socket s_ecoute, comme etant une socket d'ecoute*/
return s_ecoute ;
}
/* Une fois une connexion acceptée, on lance le script de gestion du client */
void *gerer_client (void *data) {
int quit = 0;
/* le descripteur vers le client */
int s_dial = *(int *) data ;
/* buffer utilisée pour l'envoi et la reception des données */
char buff[80] ;
int n ;
while(!quit){
n = read (s_dial, buff, 80);
/* Demande de fin de connexion */
if( strcmp(buff, "QUIT") == 0 )
quit = 1;
else if( strcmp(buff, "LOGIN") == 0 ){
printf("Demande de login\n");
}
else if( strcmp(buff, "?VISION") == 0 ){
printf("Demande de vision\n");
}
else if( strcmp(buff, "GO") == 0 ){
printf("Demande de deplacement\n");
}
else if( strcmp(buff, "?ETAT") == 0 ){
printf("Demande d'etat\n");
}
else{
printf("Commande inconnue\n");
}
}
printf("Fin du client\n");
/*write (s_dial, "phrase", 18) ;*/
}
int main () {
/* On initialise notre socket d'écoute */
int s_ecoute ;
int r ;
s_ecoute = create_tcp_server (5000, 5) ;
/* La boucle principale d'acceptation des client */
while (1) {
/* les éléments utiles pour notre gestionnaire de thread */
pthread_attr_t *thread_attributes ;
pthread_t tid ;
int *s_dial ;
s_dial = malloc (sizeof *s_dial) ;
/* On récupere le descripteur vers le client */
*s_dial = accept (s_ecoute, NULL, 0) ;
/* On initialise notre gestionnaire de thread */
thread_attributes = malloc (sizeof *thread_attributes) ;
r = pthread_attr_init (thread_attributes) ;
r = pthread_attr_setdetachstate (thread_attributes, PTHREAD_CREATE_DETACHED) ;
/* On connecte le nouveau client sur la fonction gerer_client */
r = pthread_create (&tid, thread_attributes, gerer_client, s_dial) ;
printf("Nouveau client connecté\n");
/* On vide les attributs pour le client suivant */
r = pthread_attr_destroy (thread_attributes) ;
}
/* Fin du programme */
close (s_ecoute) ;
exit (EXIT_SUCCESS) ;
} |
Partager