#include #include #include #include #include #include /* pour read(2)/write(2) */ #include /* pour getaddrinfo*/ #include /* pour memset */ #include /* pour inet_ntop */ #define LINE_MAX 1024 /* taille MAX en réception */ void usage() { fprintf(stderr,"usage : client hostname port\n"); exit(1); } int main(int argc, char **argv) { int s, ret; struct addrinfo hints, *result; char msg[LINE_MAX]; char response[LINE_MAX]; /* Vérification des arguments */ if(argc!=3) { fprintf(stderr,"Erreur : Nb args !\n"); usage(); } memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_flags = 0; hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ hints.ai_socktype = SOCK_STREAM; /* socket TCP (flux) */ hints.ai_protocol = 0; /* Any protocol */ hints.ai_canonname = NULL; hints.ai_addr = NULL; hints.ai_next = NULL; ret = getaddrinfo(argv[1], argv[2], &hints, &result); if (ret != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret)); exit(EXIT_FAILURE); } /* Création de la socket IPv4/IPv6 */ if((s=socket(result->ai_family, result->ai_socktype, result->ai_protocol))==-1) { perror("socket"); exit(1); } /* Connexion au serveur */ if(connect(s, result->ai_addr, result->ai_addrlen)) { perror("connect"); exit(1); } freeaddrinfo(result); // si result ne sert plus // while(fgets(msg, LINE_MAX, stdin) != NULL) { // msg[strlen(msg)-1]=0; /* retire '\n' final */ // /* Émission */ // if(send(s, "msg", strlen(msg)+1, 0) != strlen(msg)+1) { // perror("send"); exit(1); // } /* Attente et lecture de la réponse */ while((ret=recv(s, response, LINE_MAX, 0))!=-1) { if(ret==0) { fprintf(stderr, "Déconnexion du serveur !\n"); exit(1); } else if(ret == -1) { perror("recv"); exit(1); } puts(response); } if(close(s)==-1) { perror("close"); exit(1); } return 0; }