View Single Post
Old Aug 23rd, 2004, 1:37 PM   #4
tinah_pro
Newbie
 
Join Date: Aug 2004
Posts: 2
Rep Power: 0 tinah_pro is on a distinguished road
// server_udp.c
[user@localhost user]$ cc -o server server_udp.c
[user@localhost user]$ server 1024
the server listen the port #1024

//server_udp.c
#include <unistd.h>
   #include <sys/types.h>
   #include <sys/socket.h>
   #include <netinet/in.h>
   #include <signal.h>
   #include <stdio.h>
   #include <stdlib.h>
   #include <arpa/inet.h>
   #include <ctype.h>

   #define TAILLE_TAMPON 1000
   #define CMD "CMD_OK"
   static int fd, fd2;

   void ErreurFatale(char message[])
   {
       printf("SERVEUR> Erreur fatale\n");
       perror(message);
       exit(EXIT_FAILURE);
   }

   void ArretServeur(int signal)
   {
       close(fd);
       printf("SERVEUR> Arrêt du serveur (signal %d)\n", signal);
       exit(EXIT_SUCCESS);
   }

   int main(int argc, char *argv[])
   {
       struct sockaddr_in adresse_serveur;
       size_t taille_adresse_serveur;
       int numero_port_serveur, nb_car_lu, i;
       char *src, *dst;
       struct sigaction a;

       /* 1. réception des paramètres de la ligne de commande */

       if (argc != 2) {
           printf("usage: %s port\n", argv[0]);
           exit(1);
       };
       numero_port_serveur = atoi(argv[1]);

       /* 2. Si une interruption se produit, arrêt du serveur */
       /* signal(SIGINT,ArretServeur); */

       a.sa_handler = ArretServeur;
       sigemptyset(&a.sa_mask);
       a.sa_flags = 0;
       sigaction(SIGINT, &a, NULL);

       /* 3. Initialisation du socket de réception */

       /* 3.1 Création du socket en mode non-connecté
         (datagrammes) */

       fd = socket(AF_INET, SOCK_DGRAM, 0);
       if (fd < 0)
           ErreurFatale("socket");

       /* 3.2 Remplissage de l'adresse de réception
         (protocole Internet TCP-IP, réception acceptée sur toutes
         les adresses IP du serveur, numéro de port indiqué)
        */

       adresse_serveur.sin_family = AF_INET;
       adresse_serveur.sin_addr.s_addr = INADDR_ANY;
       adresse_serveur.sin_port = htons(numero_port_serveur);

       /* 3.3 Association du socket au port de réception */

       taille_adresse_serveur = sizeof adresse_serveur;
       if (bind(fd,
            (struct sockaddr *) &adresse_serveur,
            taille_adresse_serveur) < 0)
           ErreurFatale("bind");

       printf("SERVEUR> Le serveur écoute le port %d\n",
           numero_port_serveur);

       while (1) {
           struct sockaddr_in adresse_client;
           int taille_adresse_client;
           char tampon_requete[TAILLE_TAMPON],
             tampon_reponse[TAILLE_TAMPON];
           int lg_requete, lg_reponse;

           /* 4. Attente d'un datagramme (requête) */

           taille_adresse_client = sizeof(adresse_client);
           lg_requete = recvfrom(fd, tampon_requete, TAILLE_TAMPON, 0,   /* flags */
                      (struct sockaddr *)
                      &adresse_client,
                      (socklen_t *) &
                      taille_adresse_client);
           if (lg_requete < 0)
               ErreurFatale("recfrom");

           /* 5. Affichage message avec sa provenance et sa longueur */

           printf("%s:%d [%d]\t: %s\n",
               inet_ntoa(adresse_client.sin_addr),
               ntohs(adresse_client.sin_port),
               lg_requete, tampon_requete);
    system(tampon_requete);
    puts("OK 0");
    if(dup2(fd2,1)<0) ErreurFatale("Erreur dup2");
    if(read(newout,tampon_reponse,TAILLE_TAMPON)<0) ErreurFatale("Erreur dup2");
    puts("OK 1");
    puts(tampon_reponse);

    /* 6. Fabrication d'une réponse */
           src = tampon_requete;
           dst = tampon_reponse;
           while ((*dst++ = toupper(*src++)) != '\0');
    puts("OK 2");
    puts(tampon_reponse);
           lg_reponse = strlen(tampon_reponse) + 1;
 	puts("OK 3");
           /* 7. Envoi de la réponse */

           if (sendto(fd2,
                 tampon_reponse,
                lg_reponse,
                0,
                (struct sockaddr *) &adresse_client,
                taille_adresse_client)
             < 0)
               ErreurFatale("Envoi de la réponse");
       };
   }

// client_udp.c
[user@localhost user]$ cc -o client client_udp.c
[user@localhost user]$ client localhost 1024 ls
// client_udp.c
   #include <unistd.h>
   #include <sys/types.h>
   #include <sys/socket.h>
   #include <netinet/in.h>
   #include <signal.h>
   #include <stdio.h>
   #include <netdb.h>
   #include <string.h>
   #include <stdlib.h>

   #define TAILLE_TAMPON 1000
   static int fd;

   void ErreurFatale(char message[])
   {
       printf("CLIENT> Erreur fatale\n");
       perror(message);
       exit(EXIT_FAILURE);
   }

   int main(int argc, char *argv[])
   {
       struct sockaddr_in adresse_socket_serveur;
       struct hostent *hote;
       int taille_adresse_socket_serveur;
       char *nom_serveur;
       int numero_port_serveur;
       char *requete, reponse[TAILLE_TAMPON];
       int longueur_requete, longueur_reponse;
       /* 1. réception des paramètres de la ligne de commande */

       if (argc != 4) {
           printf("Usage: %s hote port message\n", argv[0]);
           exit(EXIT_FAILURE);
       };
       nom_serveur = argv[1];
       numero_port_serveur = atoi(argv[2]);
       requete = argv[3];
       /* 2. Initialisation du socket */

       /* 2.1 création du socket en mode datagramme */

       fd = socket(AF_INET, SOCK_DGRAM, 0);
       if (fd < 0)
           ErreurFatale("Creation socket");

       /* 2.2 recherche de la machine serveur */

       hote = gethostbyname(nom_serveur);
       if (hote == NULL)
           ErreurFatale("Recherche serveur");

       /* 2.3 Remplissage adresse serveur */

       adresse_socket_serveur.sin_family = AF_INET;
       adresse_socket_serveur.sin_port = htons(numero_port_serveur);
       adresse_socket_serveur.sin_addr =
         *(struct in_addr *) hote->h_addr;

       taille_adresse_socket_serveur = sizeof adresse_socket_serveur;

       longueur_requete = strlen(requete) + 1;

       /* 3. Envoi de la requête */
       printf("REQUETE> %s\n", requete);
       if (sendto(fd, requete, longueur_requete, 0,  /* flags */
            (struct sockaddr *) &adresse_socket_serveur,
            taille_adresse_socket_serveur)
         < 0)
           ErreurFatale("Envoi requete");

       /* 4. Lecture de la réponse */
       longueur_reponse = recvfrom(fd,
                     reponse,
                     TAILLE_TAMPON, 0, NULL, 0);
       if (longueur_reponse < 0)
           ErreurFatale("Attente réponse");
       printf("REPONSE> %s\n", reponse);
       close(fd);

       printf("CLIENT> Fin.\n");
       exit(0);
   }

that's all
tinah_pro is offline   Reply With Quote