From 190df5960a2a872d11925487f2d84cff59d2350c Mon Sep 17 00:00:00 2001 From: Flavien Haas Date: Tue, 29 Oct 2019 13:47:05 +0100 Subject: [PATCH] ajout fonction con_client --- serveur_echo.c | 69 +++++++++++++++++++++++-------------------------- serveur_echo.o | Bin 13280 -> 13328 bytes 2 files changed, 33 insertions(+), 36 deletions(-) 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 c46a99dabcb13ff4d5b2c3bdd2f5ff70701950bc..0c3fa2dfa36374bbf10b845ce81572fa6848d1d2 100755 GIT binary patch delta 1661 zcmZ8hZD?Cn7(Pi8Y16JZp{rZbwReNi2%<|rW~wXg<^reE){IiM%1E>1+7!E_B&pPo zkd5?0FV_pLhdCyQ!5{vRfrVJy^t&@~D|)sXfK zEGMjJ{+j&{8!0#%ESJeW$DzQN&>~i+%2-Y7SRLNP>cAac2BYHN&Zf7KF!KVWVb%V~ zM!}~JY-1%|P=3_kWSQv#);b%gPr1H;^e*yRZA&Iw6tQMM2pvEyNCWswIGZkk+}krBLD{Sg2LBuotZBQW)kP+&buYmoa3y}G@p2gku+>GQ zRr^soRC<+`v9eME2i&Gln2RwO;{{e9y-*33U4$Us;E-X^zSQ&PDXg>;Dr*ZG)RR=_ zCDxfRLq`ke-J)u6d$i7zW=Yhp$T}@450jiD(fXsJ;lAoZ$Z)T+{W|Oj^=k*N!Ixu0 zhI@o8)L&?RIX*QJ5o7U`czQe*aiHO3XiR!hbSK5hcp^n4VQde5JUSqku0Z}*q18D* zY6~s!cj5}iHI6@UyuQq#A!|aCg2{OJ9VvzS;;~?OVqA))&|nqHHKHoC`Xp?*{jimKX?U(NXW4{N{X#~( zt(o3h^D#RF9s#U7ujBKai*=^IlkysbCPkBX1BY<OPQN85e0*1qCsg| b3Qwh^U{nf4qy!3vAO8yEK>H1NhYlnXK>5owQqr$@7!9|G1wwOc^w|+o=2%aLkf&MrlU@GYP&g?eAF3i01 zJoA3f>|B~EO*__WSxDjsWY0(FkKKgwO*ZD?1R{rXTwrs`3F6V2Jd# za6owf7($O;ezBgGeL?@suO}miR=XoB#k&`eo_nN)28AwfqK2LkMgkFVR0(EBVfbN; z<-Qbt_R*5iPOntgdsLdQZi&1OWnwbFhe_JRWVD3I@V5CfkZO20o8Cp@g=fGN6X6@k z0+TK>yo=Sep?+(&bIY`Wwc~%VrFuh0rbrLhG*>L%d4&dRn@*jzZ7>O!G4X@qN1zzm z>RZ|zSXwuAsQ3%kYE`+jXIbWlfNj;@N~|i4|5(;W_*N4rY=k#icQ9FNq#x9FWG$?Ba+TD1xyl>t>`z`A<^s};z}8`(`;**I?$?OLi)BrZ;*xEQ7j;MY^9CI z7M|eU>Vh6DK*-S6($`Cd`36`!9r%rPUMLGs*ls$Ey`DuzLdW zzGB`8>+^`6(n0RjU@7I`+E}eC0fem9t9-r&GmX@B*A8h1*I?au%4!{@*X!PE8l8(x z$|t1OIVllOrmE4&`25U-G#gJzXQpQ-XiS{EpS=`MgLgJw%Ka!F@yGJci}1N4Hy!z% zBY$$_?~W`x@^44_oL8dGk&TXQab#OACawB=I>(c;9G#1gpOaJQ#QE6tEb2+hbMrGP zGywfZ7076Ssr(?DdV%1d(QpM?g3uP74jswdd*==TBLbhOv7asWT8LGEB^!qT!#1~s zCF*wJeit5e;TK$Z%*L60hi6?1DHmRJ;kR7)T^Ihug|E4=&hdf&D=NAa?xTMm>!@On h0sM!EqXr2@qvxlh@`5}*pOT|fa%@6Q(!q|K{{c6oz8?Sp