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
|
int main(int argc, char* argv[])
{
int ds,port,ta,da,sock;
struct sockaddr_in name;
puts("Serveur en attente");
puts("");
port = 18000;
ds = socket(PF_INET, SOCK_STREAM, 0); //On crée notre socket de connection
if(ds < 0) //Avec un test pour éviter les erreurs
{
perror("Probleme socket : ");
exit(-1);
}
init_sockaddr(&name,"0.0.0.0",port); //On initialise notre socket internet, le port ecoute sur toute les adresse
if (bind(ds, (struct sockaddr *) &name, sizeof(struct sockaddr)) < 0) //On bind
{ //Avec un test pour éviter les erreurs
perror("Probleme bind : ");
exit(-1);
}
if(listen(ds, FILED) < 0 ) //On listen dans notre socket de connexion jusqu'à "FILED" client max
{ //Avec un test pour éviter les erreurs
perror("Probleme listen ");
exit(-2);
}
while(1) //Serveur multi-client donc boucle infinie
{
FD_ZERO(listeClients); //On reinitialise notre liste d'attente
FD_SET(ds,listeClients); //Dans laquelle on place notre socket de connexion
if((select(FILED+1, listeClients, NULL, NULL,NULL)) < 0) //On fait notre select sur notre liste de client
{ //Avec un test pour éviter les erreurs
perror("select");
exit(-3);
}
for(sock=3;sock < FILED;sock++) //On parcourt toutes nos (potentielles) sockets
{
if(FD_ISSET(sock,listeClients)) //On regarde quelle descripteur change d'etat
{
if(sock==ds) //Si c'est la socket de connection...
{
da = accept(ds, (struct sockaddr *) &name, &ta); //...on l'accepte...
if(da < 0) //...toujours avec un test pour éviter les erreurs...
{
perror("Probleme accept ");
exit(-3);
}
printf("Connexion socket n°%d établie\n",da);
FD_SET(da,listeClients); //...et on la rajoute dans notre liste de clients
}
else str_echo(sock);//traiterClient(sock);
//Si ce n'est pas la socket de connection, c'est alors une socket de data
//On appelle donc notre fonction de transfert proprement dite en passant en argument...
} //...la socket où le client envoi son fichier
}
}
close(da);
close(ds);
return 0;
}
void init_sockaddr (struct sockaddr_in *name, const char *hostname, uint16_t port)
{
struct hostent *hostinfo;
name->sin_family = AF_INET; // Adresses IPV4 (Internet)
name->sin_port = htons (port); // On gère le little/big Endian
hostinfo = gethostbyname (hostname); // appeler les fonctions de résolution de nom de la libC
if (hostinfo == NULL) // Si ne peut transformer le nom de la machine en adresse IP
{
fprintf (stderr, "Unknown host %s.\n", hostname);
exit (-1);
}
name->sin_addr = *(struct in_addr *) hostinfo->h_addr; // Le dernier champs de la structure est garni
}
void str_echo(int sockfd)
{
printf("Bonjour\n");
} |
Partager