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
|
while(1)
{
/* on reconstitue le fds_lecture */
FD_ZERO(&fds_lecture);
unClient = deb_liste;
while ( unClient )
{
if ( max < unClient->fd)
{
max = unClient->fd;
}
FD_SET(unClient->fd,&fds_lecture);
unClient = unClient->suivant;
}
if ( select(max+1,&fds_lecture,NULL,NULL,NULL) != -1 )
{
/* On se repositionne en debut de liste et on la parcourt */
unClient = deb_liste;
while( unClient )
{
/* Si il sait passer quelque chose dans l'emsemble de lecture avec ce client */
if ( FD_ISSET(unClient->fd,&fds_lecture))
{
/* Si c'est la socket d'ecoute ==> nouvelle connexion ! */
if ( unClient->fd == s_ecoute )
{
unsigned int size_client_addr = sizeof(client_addr);
SOCKET newClient = accept(s_ecoute,(struct sockaddr *)&client_addr,&size_client_addr);
int oct_rec;
if ( newClient != INVALID_SOCKET )
{
char login[LOGIN_SIZE];
printf("Connexion d'un nouveau client : %s socket : %d...\n",inet_ntoa(client_addr.sin_addr),newClient);
/* if ( newClient > max )
{
max = newClient;
}*/
/* On attend la réception de son login */
oct_rec = recv(newClient,login,sizeof(login),0);
if ( oct_rec != - 1)
{
/* On procède à l'authentification du login */
int authent = authentification(login);
if ( authent == 0 )
{
printf("Authen ok\n");
/* Authentification reussie ! */
/* On met le nouveau client dans la liste */
ajouter_client(&deb_liste,login,"",newClient);
/* On le met aussi dans l'ensemble de lecture */
FD_SET(newClient,&fds_lecture);
}
else
{
/* Client inconnu ! */
char erreur404[] = "Desole vous n'etes pas dans la base de donnees...\n";
int oct_env;
/* On envoie un message d'erreur au client inconnu */
oct_env = send(newClient,erreur404,sizeof(erreur404),0);
if ( oct_env == -1 )
{
perror("send() 404error");
}
}
}
else
{
perror("revc() login");
}
}
else
{
perror("accept()");
}
}
else
{
/* Le client en cours a fait une action ! */
int oct_rec;
char message[144]; /* 16 premiers octets pour le login du destinataire, le reste c'est le message */
oct_rec = recv(unClient->fd,message,sizeof(message),0);
if ( oct_rec <= 0 )
{
/* Erreur ou deconnexion client */
printf("Deconnexion de %s...\n",unClient->login);
/* On le retire de l'ensemble de lecture */
FD_CLR(unClient->fd,&fds_lecture);
/* On le retire de la liste */
retirer_client(&deb_liste,unClient->fd);
}
else
{
/* Le client a envoye un message ! */
printf("%s a envoyé %d octets !\n",unClient->login,oct_rec);
}
}
}
unClient = unClient->suivant;
} /* Fin du parcour de la liste */
}
else
{
perror("select()");
}
} /* Fin de la boucle infinie */ |
Partager