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
|
int sock_ecoute, sock_service;
int sock1, sock2;
socklen_t lemis;
fd_set fd;
struct sockaddr_in serveur_adr, client_adr;
char *data=malloc(sizeof(char)*1024);
bzero(data,sizeof(data));
int rval, n_sock;
char *morpion=malloc(sizeof(char)*9);
bzero(morpion,sizeof(morpion));
/* j'initialise les cases de mon morpion à "-" */
sock_ecoute= socket(AF_INET, SOCK_STREAM, 0);
if(sock_ecoute < 0)
{
perror("socket");
exit(1) ;
}
bzero(&serveur_adr, sizeof (serveur_adr));
serveur_adr.sin_family= AF_INET;
serveur_adr.sin_addr.s_addr= INADDR_ANY;
serveur_adr.sin_port= htons(NPORT);
if(bind(sock_ecoute, (struct sockaddr*)&serveur_adr, sizeof(serveur_adr)) !=0)
{
perror("bind");
close(sock_ecoute);
return 1;
}
printf("socket serveur TCP port #%d\n", ntohs(serveur_adr.sin_port));
listen(sock_ecoute, 5);
while(1) /*Serveur multi-client donc boucle infinie*/
{
bzero(&client_adr, sizeof(client_adr));
lemis= sizeof(client_adr);
FD_ZERO(&fd); /*On reinitialise notre liste d'attente*/
FD_SET(sock_ecoute, &fd); /*Dans laquelle on place notre socket de connexion*/
FD_SET(sock1, &fd);
FD_SET(sock2, &fd);
sock_service= accept(sock_ecoute, (struct sockaddr*)&client_adr, &lemis);
/*...on l'accepte...*/
if(sock_service < 0) /*...toujours avec un test pour éviter les erreurs...*/
{
perror("Probleme accept ");
exit(1);
}
rval=select(n_client+1, &fd, NULL, NULL,NULL);
if(rval < 0) /*On fait notre select sur notre liste de client*/
{ /*Avec un test pour éviter les erreurs*/
perror("select");
exit(1);
}
if(rval)
{
if(FD_ISSET(sock1,&fd)) //teste si c'est la sock1 qui a envoyé le msg
{
data=invite_jeu(morpion,data);
if(write(sock1,data,sizeof(data)) < 0) //on lui envoie le jeu actuel
{
perror("write server");
exit(1);
}
morpion=traiterClient(sock_service,"sock1",morpion); //on traite le client
}
else
if(FD_ISSET(sock2,&fd))
{
data=invite_jeu(morpion,data);
if(write(sock2,data,sizeof(data)) < 0)
{
perror("write server");
exit(1);
}
morpion=traiterClient(sock_service,"sock2",morpion);
}
}
}
close(sock_service);
close(sock_ecoute);
} |
Partager