/* librairie standard ... */ #include /* pour getopt */ #include /* déclaration des types de base */ #include /* constantes relatives aux domaines, types et protocoles */ #include /* constantes et structures propres au domaine UNIX */ #include /* constantes et structures propres au domaine INTERNET */ #include /* structures retournées par les fonctions de gestion de la base de données du réseau */ #include /* pour les entrées/sorties */ #include /* pour la gestion des erreurs */ #include #define BASE_SIZE 10 void construire_message(char *message, char motif, int lg) { int i; for (i=0;ih_addr, hp->h_length ) ; for (int i = 0; i < nb_message; i++) { // Construction du message construire_message(message, 'a' + (i % 26), BASE_SIZE); // Envoi du message sendto(sock,message,longueur_message,0,(struct sockaddr*)&adr_dest,longueur_adr_dest); } } else { // Creation de l'adresse du socket distant struct sockaddr_in adr_locale; int longueur_adr_locale = sizeof(adr_locale); int longueur_message = BASE_SIZE; memset((char *)& adr_locale, 0, sizeof(adr_locale)) ; adr_locale.sin_family=AF_INET; adr_locale.sin_port=port; adr_locale.sin_addr.s_addr = INADDR_ANY; // Bind the local socket to any local address (ie any available interface) if (bind(sock, (struct sockaddr *) &adr_locale, longueur_adr_locale) == -1) { printf("failed to bind\n"); exit(1); } while (1) { // Receive a single message because we are lazy recvfrom(sock, message, longueur_message, 0, NULL, NULL); // Afficher notre seule et unique triste message afficher_message(message, longueur_message); } } } else{ // Creation du socket local int sock= socket(AF_INET,SOCK_STREAM,0); if (source==1) { // Creation de l'adresse du socket distant struct hostent *hp ; struct sockaddr_in adr_dest; int longueur_adr_dest = sizeof(adr_dest); int longueur_message = BASE_SIZE; memset((char *)& adr_dest, 0, sizeof(adr_dest)) ; adr_dest.sin_family=AF_INET; adr_dest.sin_port=port; if ((hp = gethostbyname(nom_machine_distante)) == NULL) { printf("erreur gethostbyname\n") ; exit(1) ; } memcpy( (char*)&(adr_dest.sin_addr.s_addr), hp->h_addr, hp->h_length ) ; // Demande de connexion int succ; if ((succ=connect(sock,(struct sockaddr*) &adr_dest,longueur_adr_dest))!=0){ printf("Echec connect"); exit(1); } // Envoie des messages for (int i = 0; i < nb_message; i++) { // Construction du message construire_message(message, 'a' + (i % 26), BASE_SIZE); // Envoi du message write(sock,message,longueur_message); } // Close socket to avoid dangling connections close(sock); } else { // Creation de l'adresse du socket local struct sockaddr_in adr_locale; socklen_t longueur_adr_locale = sizeof(adr_locale); int longueur_message = BASE_SIZE; memset((char *)& adr_locale, 0, sizeof(adr_locale)) ; adr_locale.sin_family=AF_INET; adr_locale.sin_port=port; adr_locale.sin_addr.s_addr = INADDR_ANY; // Bind the local socket to any local address (ie any available interface) if (bind(sock, (struct sockaddr *) &adr_locale, longueur_adr_locale) == -1) { printf("failed to bind\n"); exit(1); } // set linstening queue size if (listen(sock, 5) == -1) { printf("échec et mat listen\n"); exit(1); } int sock_bis; // Accept a single connection on the main thread if ((sock_bis = accept( sock, (struct sockaddr *)&adr_locale, &longueur_adr_locale)) == -1){ printf("échec du accept\n") ; exit(1) ; } while (read(sock_bis, message, longueur_message) > 0) { afficher_message(message, longueur_message); } close(sock_bis); close(sock); } } exit(0); }