diff --git a/serveur_echo.c b/serveur_echo.c deleted file mode 100755 index e9333f4..0000000 --- a/serveur_echo.c +++ /dev/null @@ -1,103 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#define BUF_SIZE 500 - -struct addrinfo *result; // tableau des adresses réseaux des clients - -int cree_socket(struct addrinfo hints, char* port){ - int s = getaddrinfo(NULL, port, &hints, &result); - if (s != 0) { - fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s)); - s = 1; - } - 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); - } -} - -void traite_connexion(int sfd, int s){ - ssize_t nread; - char buf[BUF_SIZE]; - struct sockaddr_storage peer_addr; - socklen_t peer_addr_len; - // 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); - } - 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"); - } - } -} - - -int main(int argc, char *argv[]){ - struct addrinfo hints; - int s; // s code de retour de getaddrinfo - int sfd; // code de retour de l'ouverture du socket - - if (argc != 2) { // test du nombre d'arguments entrés - fprintf(stderr, "Usage: %s port\n", argv[0]); - exit(EXIT_FAILURE); - } - - char* port = argv[1]; // récupération du port passée en paramètre du programme - - // remplissage de la structure hints contenants la configuration réseau du serveur - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = AF_UNSPEC; // utilisation du serveur sur IPv4/v6 (AF_INET/AF_INET6) - hints.ai_socktype = SOCK_DGRAM; // socket en mode datagramme - - s = cree_socket(hints, port); // création du socket - if(s == 1) { - exit(EXIT_FAILURE); - } - - con_client(&sfd); - - freeaddrinfo(result); // libère la structure d'adresse client - - traite_connexion(sfd, s); - - -}