Ressources informatiques

Ressources informatiques

Ressources informatiques

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 : !