/*********************************************************** cli_fork.c -Ce client attend des entrees sur stdin et les envoie au serveur auquel il est connecte. - UTILISER la commande netstat pour voir les connexions entrantes et sortantes sur la machine. *********************************************************/ #include #include #include #include #include #include #include #include int main (int argc, char *argv[]) { int Sock_Des , pid; struct sockaddr_in6 Le_Serveur ; struct sockaddr_in6 Le_Client ; struct hostent *Ptr_H ; static char MESSAGE [] = "Message envoyé par client XXXXX\n" ; int res; char Tab [1024] ; int Taille = sizeof (Le_Client); if (argc != 3) { fprintf (stderr, "Syntaxe : %s hote port\n", argv[0]); exit (1); } pid = getpid(); sprintf (MESSAGE + 26, "%d\n", pid); /* creation du socket du client */ if ((Sock_Des = socket (PF_INET6,SOCK_STREAM,0)) < 0) { perror ("Erreur d'ouverture du socket") ; exit (1) ; } /* Construction de l'adresse du serveur qui comprend plusieurs champs : * - adresse IP de la machine ou se trouve le serveur * (recuperee par gethostbyname2) * - numero de port du serveur * (passe sur la ligne de commande) */ Le_Serveur.sin6_family = AF_INET6; if ((Ptr_H = gethostbyname2 (argv[1], AF_INET6)) == NULL) { fprintf (stderr,"%s : Hôte inconnu\n",argv[1] ) ; exit (2); } memcpy ((char *) &Le_Serveur.sin6_addr,(char *)Ptr_H->h_addr,Ptr_H->h_length); Le_Serveur.sin6_port=htons (atoi (argv[2])) ; /* connexion vers le serveur */ if (connect(Sock_Des,(struct sockaddr *)&Le_Serveur,sizeof (Le_Serveur)) < 0) { perror (" Erreur de connexion sur la socket serveur."); exit (2) ; } /* Verifications sur les ports : * getsockname donne le port local * getpeername donne le port distant */ if (getsockname (Sock_Des, (struct sockaddr *) &Le_Client, &Taille) < 0) { perror ("Client : erreur sur getsocketname ") ; exit (1) ; } printf (" Numero de mon port : %d\n", ntohs (Le_Client.sin6_port)) ; if (getpeername (Sock_Des, (struct sockaddr *) &Le_Client, &Taille) < 0) { perror ("Client : erreur sur getsocketname ") ; exit (1) ; } printf (" Numero du port distant : %d\n", ntohs (Le_Client.sin6_port)) ; printf (" **************************************\n"); /* attendre message de debut de comm. depuis serveur */ if ((res = read (Sock_Des,Tab,sizeof (Tab))) < 0) perror ("Erreur de lecture sur la socket de comm."); else { Tab[res] = '\0'; printf ("[%05d] Message reçu du serveur :\n %s", pid, Tab); } if (write (Sock_Des, MESSAGE, strlen (MESSAGE)) < 0) perror ("Erreur d'écriture vers le serveur"); /* Entrer les messages a transmettre via le clavier (stdin) la fin des entrees est indiquee par la chaine fin */ while (fgets (Tab, sizeof(Tab), stdin)) { if (!strncmp (Tab, "fin", 3)) break; if (write (Sock_Des, Tab, strlen (Tab)) < 0) { fprintf (stderr, "[%05d] ", getpid ()); perror ("Erreur d'écriture vers le serveur"); } } shutdown(Sock_Des, 1); /* lire la reponse du serveur */ if ((res = read (Sock_Des, Tab, sizeof Tab)) < 0) { fprintf (stderr, "[%05d] ", getpid ()); perror ("Erreur de lecture sur la socket de comm.") ; } else { Tab [res] = '\0'; printf ("[%05d] Message reçu du serveur :\n %s", pid, Tab); } close (Sock_Des) ; return 0; }