diff --git a/serveur_echo.c b/serveur_echo.c index 1bb791b..4ac34b8 100755 --- a/serveur_echo.c +++ b/serveur_echo.c @@ -8,31 +8,50 @@ #define BUF_SIZE 500 +struct addrinfo *result; // tableau des adresses réseaux des clients + +// affiche_adresse_socket, serveur et traite_connexion + +int cree_socket(struct addrinfo hints, char* ip){ + //remplissage de la structure hints contenants la configuration réseau du serveur + memset(&hints, 0, sizeof(struct addrinfo)); + + int s = getaddrinfo(NULL, ip, &hints, &result); + if (s != 0) { + fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s)); + s = 1; + } + return s; +} + int main(int argc, char *argv[]){ struct addrinfo hints; - struct addrinfo *result, *rp; - int sfd, s; + struct addrinfo *rp; + int sfd, s; // s code de retour de getaddrinfo struct sockaddr_storage peer_addr; socklen_t peer_addr_len; ssize_t nread; char buf[BUF_SIZE]; - if (argc != 2) { + if (argc != 2) { // test du nombre d'arguments entrés fprintf(stderr, "Usage: %s port\n", argv[0]); exit(EXIT_FAILURE); } - //remplissage de la structure hints contenants la configuration réseau du serveur - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = AF_INET6; // utilisation du serveur sur IPv6 (AF_UNSPEC pour IPv4/6) - hints.ai_socktype = SOCK_DGRAM; // socket en mode datagramme + char* ip = argv[1]; - s = getaddrinfo(NULL, argv[1], &hints, &result); - if (s != 0) { - fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s)); + // remploissage 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 + + s = cree_socket(hints, ip); // création du socket + if(s == 1) { exit(EXIT_FAILURE); } + + + /* 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) @@ -45,20 +64,20 @@ int main(int argc, char *argv[]){ } if (bind(sfd, rp->ai_addr, rp->ai_addrlen) == 0){ - break; /* Succès */ + break; // Succès } close(sfd); } - if (rp == NULL) { /* Aucune adresse n'a pu marcher */ + if (rp == NULL) { // Aucune adresse n'a pu marcher fprintf(stderr, "Could not bind\n"); exit(EXIT_FAILURE); } - freeaddrinfo(result); /* libère le buffer */ + freeaddrinfo(result); // libère - /* Lit les datagrammes et les renvois au client */ + // Lit les datagrammes et les renvois au client for (;;) { peer_addr_len = sizeof(struct sockaddr_storage); diff --git a/serveur_echo.o b/serveur_echo.o index 2f4945e..c46a99d 100755 Binary files a/serveur_echo.o and b/serveur_echo.o differ