Créer un client TCP
Le client envoie une lettre au serveur qui renvoie la lettre suivante dans l'ordre alphabétique. Le serveur envoie le caractère '!' s'il reçoit un caractère qui n'est pas une lettre ou s'il reçoit la lettre 'z' ou la lettre 'Z'.
Se documenter
Code du client
/** * @brief Envoie une lettre au serveur et reçoit la lettre suivante dans l'alphabet * @example clientTcp 192.168.1.11 40000 a */ #include <string.h> // pour memset() #include <sys/socket.h> // pour socket(), recv(), send(), connect() #include <sys/types.h> // pour socket(), recv(), send(), connect() #include <stdio.h> // pour perror(), printf(), fprintf() #include <arpa/inet.h> // pour htons(), inet_pton() #include <stdlib.h> // pour strtol() #include <unistd.h> // pour close() int main(int argc, char * argv[]){ int maSocket; struct sockaddr_in coupleIPPortServeur; long int adresseIPServeur; unsigned short numeroPortServeur; char lettre; char lettreReponse; socklen_t longueurServeur; // Tester le nombre d'arguments if (argc != 4) { fprintf(stderr,"usage : clientTcp <adresse_IP_serveur> <numero_de_port_serveur> <lettre>\nexemple : clientTcp 192.168.1.11 40000 a\n"); return -1; } // Déterminer l'adresse IP et le numero de port du serveur // Adresse IP au format reseau if (inet_pton(AF_INET, argv[1], (void *)&adresseIPServeur) == -1) {perror("inet_pton"); return -1;} // Numéro de port numeroPortServeur = strtol(argv[2],NULL,10); // Initialiser les structures a des octets de valeurs 0 memset(&coupleIPPortServeur,0,sizeof(struct sockaddr_in)); // Créer la socket client en mode TCP if ((maSocket = socket(AF_INET,SOCK_STREAM,0)) == -1) {perror("socket");return -1;} // Initialiser l'adresse IP et le numéro de port du serveur // socket du domaine reseau coupleIPPortServeur.sin_family = AF_INET; // adresse IP coupleIPPortServeur.sin_addr.s_addr = adresseIPServeur; //affecter le numero de port de l'application coupleIPPortServeur.sin_port = htons(numeroPortServeur); // Effectuer la demande connexion au serveur longueurServeur = sizeof(coupleIPPortServeur); if (connect(maSocket, (struct sockaddr *)&coupleIPPortServeur, longueurServeur) == -1) {perror("connect");return -1;} lettre = argv[3][0]; // Envoyer la requête if (send(maSocket, &lettre, sizeof(lettre), 0) == -1) {perror("send");return -1;} // Recevoir la reponse if (recv(maSocket, &lettreReponse, sizeof(lettreReponse), 0) == -1) {perror("recv");return -1;} // Fermer la connexion au serveur close(maSocket); // Afficher la reponse printf("J'ai émis : %c, j'ai reçu : %c\n",lettre, lettreReponse); return 0; }
Valider le protocole applicatif
doe@debian:~$ ./clientTcp usage : clientTcp exemple : clientTcp 192.168.1.11 40000 a doe@debian:~$ ./clientTcp 192.168.1.101 50000 a connect: Connection refused doe@debian:~$ ./clientTcp 192.168.1.101 40000 d J'ai émis : d, j'ai reçu : e doe@debian:~$ ./clientTcp 192.168.1.101 40000 D J'ai émis : D, j'ai reçu : E doe@debian:~$ ./clientTcp 192.168.1.101 40000 z J'ai émis : z, j'ai reçu : ! doe@debian:~$ ./clientTcp 192.168.1.101 40000 Z J'ai émis : Z, j'ai reçu : ! doe@debian:~$ ./clientTcp 192.168.1.101 40000 ? J'ai émis : ?, j'ai reçu : !