diff --git a/serveur_echo.c b/serveur_echo.c index 4ac34b8..76b38e1 100755 --- a/serveur_echo.c +++ b/serveur_echo.c @@ -10,7 +10,7 @@ struct addrinfo *result; // tableau des adresses réseaux des clients -// affiche_adresse_socket, serveur et traite_connexion +// to do : con_client, traite_connexion int cree_socket(struct addrinfo hints, char* ip){ //remplissage de la structure hints contenants la configuration réseau du serveur @@ -24,10 +24,35 @@ int cree_socket(struct addrinfo hints, char* ip){ return s; } +void con_client(int *sfd){ + struct addrinfo *rp; // structure de l'adresse du client + /* getaddrinfo () retourne une liste de structures d'adresses. + Essayez chaque adresse jusqu'à ce que nous ayons réussi à bind(2). + Si socket() (ou bind()) échoue, nous (fermons le socket et) + essayons l'adresse suivante */ + + for (rp = result; rp != NULL; rp = rp->ai_next) { + // socket crée un point de communication et renvoie un descripteur + *sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + if (*sfd == -1){ + continue; + } + if (bind(*sfd, rp->ai_addr, rp->ai_addrlen) == 0){ + break; // Succès + } + close(*sfd); + } + if (rp == NULL) { // Aucune adresse n'a pu marcher + fprintf(stderr, "Could not bind\n"); + exit(EXIT_FAILURE); + } +} + + int main(int argc, char *argv[]){ struct addrinfo hints; - struct addrinfo *rp; - int sfd, s; // s code de retour de getaddrinfo + int s; // s code de retour de getaddrinfo + int sfd; // code de retour de l'ouverture du socket struct sockaddr_storage peer_addr; socklen_t peer_addr_len; ssize_t nread; @@ -38,9 +63,9 @@ int main(int argc, char *argv[]){ exit(EXIT_FAILURE); } - char* ip = argv[1]; + char* ip = argv[1]; // récupération de l'ip passée en paramètre du programme - // remploissage de la structure config réseau serveur + // remplissage de la structure config réseau serveur hints.ai_family = AF_INET6; // utilisation du serveur sur IPv6 (AF_UNSPEC pour IPv4/6) hints.ai_socktype = SOCK_DGRAM; // socket en mode datagramme @@ -49,45 +74,18 @@ int main(int argc, char *argv[]){ exit(EXIT_FAILURE); } + con_client(&sfd); + freeaddrinfo(result); // libère la structure d'adresse client - - /* getaddrinfo () retourne une liste de structures d'adresses. - Essayez chaque adresse jusqu'à ce que nous ayons réussi à bind(2). - Si socket() (ou bind()) échoue, nous (fermons le socket et) - essayons l'adresse suivante */ - - for (rp = result; rp != NULL; rp = rp->ai_next) { - sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); - if (sfd == -1){ - continue; - } - - if (bind(sfd, rp->ai_addr, rp->ai_addrlen) == 0){ - break; // Succès - } - - close(sfd); - } - - if (rp == NULL) { // Aucune adresse n'a pu marcher - fprintf(stderr, "Could not bind\n"); - exit(EXIT_FAILURE); - } - - freeaddrinfo(result); // libère - - // Lit les datagrammes et les renvois au client - + // Lit les datagrammes et les renvoi au client for (;;) { peer_addr_len = sizeof(struct sockaddr_storage); nread = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &peer_addr, &peer_addr_len); if (nread == -1){ continue; /* ignore la mauvaise requete */ } - char host[NI_MAXHOST], service[NI_MAXSERV]; - s = getnameinfo((struct sockaddr *) &peer_addr, peer_addr_len, host, NI_MAXHOST, service, NI_MAXSERV, NI_NUMERICSERV); if (s == 0){ printf("Recu %ld octets de %s:%s\n", (long) nread, host, service); @@ -95,7 +93,6 @@ int main(int argc, char *argv[]){ else{ fprintf(stderr, "getnameinfo: %s\n", gai_strerror(s)); } - if (sendto(sfd, buf, nread, 0, (struct sockaddr *) &peer_addr, peer_addr_len) != nread){ fprintf(stderr, "Erreur d'envoi de la reponse\n"); } diff --git a/serveur_echo.o b/serveur_echo.o index c46a99d..0c3fa2d 100755 Binary files a/serveur_echo.o and b/serveur_echo.o differ