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
| #include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include "server.h"
#include "client.h"
int main(int argc, char **argv)
{
init();
SOCKET sock = init_connection();
char buffer[BUF_SIZE];
/* l'index du tableau */
int actual = 0;
int max = sock;
/* un tableau pour tous les clients */
Client clients[MAX_CLIENTS];
/* ensemble de descripteurs de fichiers qui seront surveillés
pour voir si des données en lecture sont disponibles */
fd_set rdfs;
while(1)
{
int i = 0;
/* vide l'ensemble rdfs */
FD_ZERO(&rdfs);
/* ajoute STDIN_FILENO à l'ensemble rdfs */
FD_SET(STDIN_FILENO, &rdfs);
/* ajoute le socket à l'ensemble rdfs */
FD_SET(sock, &rdfs);
/* ajoute le socket de chaque client */
for(i = 0; i < actual; i++)
{
FD_SET(clients[i].sock, &rdfs);
}
/* l'état des ou d'un descripteur de fichiers ainsi que les ensembles n'ont pas été modifiés */
if(select(max + 1, &rdfs, NULL, NULL, NULL) == -1)
{
perror("select()");
exit(errno);
}
/* quelque chose de disponible sur l'entré standard */
if(FD_ISSET(STDIN_FILENO, &rdfs))
{
/* si quelque chose est saisit au clavier nous arrêtons le programme */
break;
}
else if(FD_ISSET(sock, &rdfs))
{
/* nouveau client */
SOCKADDR_IN csin = { 0 };
size_t sinsize = sizeof csin;
/* accept renvoie un nouveau socket qui sera utiliser pour communiquer avec le client */
/* elle remplie aussi une structure SOCKADDR_IN avec les informations du client (IP et port) */
int csock = accept(sock, (SOCKADDR *)&csin, (socklen_t *)&sinsize);
if(csock == SOCKET_ERROR)
{
perror("accept()");
continue; // provoque l'arrêt de l'itération courante, et le passage au début de l'itération suivante.
}
/* après s'être connecté, le client envoie son nom */
if(read_client(csock, buffer) == 0)
{
/* déconnecté */
continue;
}
/* what is the new maximum fd ? */
max = csock > max ? csock : max;
FD_SET(csock, &rdfs);
// nous créons un objet de type Client, contenant le socket pour discuter avec lui ainsi que son pseudo.
Client c = { csock };
strncpy(c.name, buffer, BUF_SIZE - 1);
clients[actual] = c;
actual++;
}
else
{
int i = 0;
for(i = 0; i < actual; i++)
{
/* un client parle */
if(FD_ISSET(clients[i].sock, &rdfs))
{
Client client = clients[i];
int c = read_client(clients[i].sock, buffer);
/* client déconnecté */
if(c == 0)
{
closesocket(clients[i].sock);
remove_client(clients, i, &actual);
strncpy(buffer, client.name, BUF_SIZE - 1);
strncat(buffer, " disconnected !", BUF_SIZE - strlen(buffer) - 1);
send_message_to_all_clients(clients, client, actual, buffer, 1);
}
else
{
send_message_to_all_clients(clients, client, actual, buffer, 0);
}
break;
}
}
}
}
clear_clients(clients, actual);
end_connection(sock);
end();
return EXIT_SUCCESS;
} |
Partager