IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Serveur/client envoie exécution commande sur le client connecté a un serveur


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 15
    Points : 10
    Points
    10
    Par défaut Serveur/client envoie exécution commande sur le client connecté a un serveur
    Bonjour,

    je souhaiterais réaliser un programme qui envoie des commandes (unix ex: ls) à mon serveur, mon serveur exécute la commande envoyé par mon client et le résultat au client.

    voici le code coté serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    void client_read(t_env *e, int fd)
    {
      int   r;
      char  buf[4096];
      int   a = 0;
      char  **av;
      pid_t pid;
     
      av = malloc(2*sizeof(char*));
      av[0] = malloc(12);
      av[1] = NULL;
      r = read(fd, buf, 4096);
      if (r > 0)
        {
          buf[r - 1] = '\0';
          strcpy(av[0],buf);
          printf("%s\n", buf);
        }
      else
        {
          printf("%d: Connection closed\n");
          close(fd);
          e->fd_type[fd] = FD_FREE;
        }
      pid = fork();
      if (pid != 0)
        {
        }
      else
        {
          if (strcmp(buf, "ls") == 0)
            execv("/bin/ls", av);
          if (strcmp(buf, "cp") == 0)
            execv("/bin/cp", av);
          exit(1);
        }
    }
    et voici le code client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    int             get_socket(char *ip, char *port)
    {
      char          buff[400];
      int           i = 0;
      int           sock;
      struct protoent *pe;
      struct sockaddr_in    sin;
      int           error;
     
      buff[400] = '\0';
      pe = getprotobyname("TCP");
      sock = socket(AF_INET, SOCK_STREAM, pe->p_proto);
      if (sock == -1)
        return (-1);
      sin.sin_family = AF_INET;
      sin.sin_port = htons(atoi(port));
      sin.sin_addr.s_addr = inet_addr(ip);
      error = connect(sock, (const struct sockaddr *)&sin, sizeof(sin));
      if (error == -1)
        {
          close(sock);
          return (-1);
        }
     
      write(sock, "Connected\n", 10);
      int a = 0;
      while (1)
        {
          a = read(0, buff, 400);
          buff[a] = '\0';
          write(sock, buff, strlen(buff));
        }
    }
     
    int             main(int ac, char **av)
    {
      int           sock;
     
      sock = get_socket(av[2], av[1]);
      if (sock == -1)
        return (-1);
    }
    Cordialement.

  2. #2
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Et.... quel est le problème exactement ?


    (si tu veux juste faire un bind shell... il suffit d'apprendre à se servir de la commande "nc"/netcat ! )
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Alors en faite, pour le moment je peux par exemple envoyé la commande "ls" sur le client pour que l’exécution se fasse sur le serveur, mais ce que je veux faire c'est que si je tape la commande "ls" sur le client je veux afficher ce que devrait afficher le serveur sur le client.

    Cordialement.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 599
    Points
    23 599
    Par défaut
    Avant qu'on aille plus loin, est-ce que tu fais cela pour l'exercice, auquel cas on va te faire jouer avec popen(), strdup(), etc. ou est-ce que c'est un besoin réel ?

    Dans le deuxième cas, tourne-toi plutôt vers ssh (ou telnet, netcat, rsh…)

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Donc oui c'est pour de l'exercice. Sinon j'ai aussi chercher de mon côté et j'ai souvent vu l'utilisation de dup, mais je ne vois pas du tout comment l'utiliser.

    Cordialement.

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/06/2015, 16h30
  2. Table client, commande nombre de client avec n commandes
    Par sakini dans le forum Langage SQL
    Réponses: 6
    Dernier message: 22/06/2011, 11h01
  3. script d'envoie de commande sur unix
    Par world2b dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 05/02/2008, 11h40
  4. Réponses: 2
    Dernier message: 02/07/2007, 16h05
  5. Réponses: 6
    Dernier message: 09/11/2005, 18h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo