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 :

Shell Telnet : gérer Ctrl + C


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut Shell Telnet : gérer Ctrl + C
    Bonjour,

    Je suis entrain de développer sur un µControlleur un shell Telnet (coté serveur).

    Je voudrais gérer le Ctrl+C pour arrêter une commande en cours.

    Donc pendant qu'une commande tourne :
    1- Je regarde si j'ai reçu de nouvelles données
    2- Si c'est le cas je recherche le caractère Ctrl+C
    3- Si je trouve le caractère, j’arrête la commande et je vide le buffer de réception TCP jusqu'au caractère Ctrl+C => donc tous les caractères qui sont avant le Ctrl+C sont ignorés

    Cela pose deux problèmes :
    - si le buffer de réception (400 caractères) est plein, on ne pourra pas détecter le caractère Ctrl+C. Ce n'est pas trop gênant, car pour que ça arrive il faudrait que l'utilisateur tape pleins de caractères sur son clavier avant d'appuyer sur Ctr+C => cas improbable.

    - le serveur et le client telnet peuvent négocier à tout moment des valeurs de paramètres (ex: taille de l’écran) ou envoyer des commandes spéciales (ex: demande d'interruption, alarme, ...) => utilisation de caractères d’échappements (nommés IAC et ESC) suivit de une ou plusieurs valeurs.
    Donc avec ma solution actuelle, je peux rater ces séquences car je vide dans le buffer de réception tous les caractères qui sont avant mon Ctrl+C
    De plus, il se peut qu'il y ai dans ma séquence d’échappement la valeur de Ctr+C => ça sera donc interpréter par mon programme comme un Ctrl+C alors que ça ne le devrait pas.


    Est-ce que vous voyez un moyen simple d'éviter le second problème ?
    => si j'ai mal expliqué mon problème, n'hésitez pas à me demander plus de renseignements

    Remarque : il faut que mon système fonctionne si on copie/colle une série de commandes dans le client telnet


    Merci d'avance,

  2. #2
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    Si j'ai bien compris tu veux reproduire le fonctionnement du ctrl+C comme le shell de linux, pour sa je te conseille de regarder du coter de signal() pour intercepter le signal SIGQUIT ou SIGTERM si je me souviens bien

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut
    oui tu as bien compris le principe a part que je suis sur un µControlleur : je n'ai donc pas d'OS avec leur lots de fonctions standards.

    J'ai regardé ce que tu m'as donné et ça ne m'avance pas beaucoup, je ne vois toujours pas comment je dois traiter mon buffer TCP de réception...

  4. #4
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    Hum ok, sa aurait été trop simple

    Il y a un caractere où tu es sur de ne pas le retrouver dans ton buffer, car si j'ai bien compris tu peux te retrouver a recevoir un ctrl+C dans ton buffer sans que se soit celui de ta délimitation?

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut
    Le caractère Ctrl+C est le caractère avec la valeur 0x03 (http://ascii-table.com/control-chars.php)

    En gros en telnet, il y a deux caractères d’échappement permettant de gérer des commandes spéciales (ex : déplacer le curseur, activer certains modes, ...) :
    ESC (0x1B) et IAC (0xFF)

    Donc lorsqu'on détecte ces caractères, il faut ensuite analyser le caractère qui suit pour déterminer le type de commande => en fonction du type de commande, on peut déterminer la taille total de la séquence d’échappement (car elle n'est pas fixe).

    Exemple de commandes avec ESC : http://ascii-table.com/ansi-escape-sequences.php
    Exemple de négociation d'option avec IAC : http://www.ietf.org/rfc/rfc1073.txt

    Donc si la valeur 0x03 apparait dans l'une de mes séquences échappement, avec mon système actuel, il sera interprété comme un Ctrl+C et non pas comme une valeur de la séquence d’échappement.

    Donc comment devras-je gérer mon système pour que ça fonctionne correctement (actuellement, je n'ai pas de solution ... ça veut dire qu'il n'y a pas de problème ?) ?

  6. #6
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    tu utilise certainement un code qui n'est pas approprié, si le ctrl+C est déja utiliser, tu en trouve un autre, tu peux meme prendre un code bien compliquer: ctrl+alt+maj+C. La je pense pas que ce code sera utiliser

    Pas de solution => c'est que tu te pose pas la bonne question donc pas de problème

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Faire un CTRL+P dans un shell
    Par jameson dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 15/07/2008, 16h26
  2. eclipse, shell et ctrl+c
    Par kakehashi dans le forum Eclipse C & C++
    Réponses: 4
    Dernier message: 19/02/2008, 14h45
  3. Undo-Redo (Ctrl-Z, Ctrl-Y) : comment le gérer ?
    Par MiJack dans le forum Langage
    Réponses: 6
    Dernier message: 13/01/2006, 13h26
  4. Connexion Telnet et commande Shell
    Par Enano dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 05/11/2005, 08h23
  5. [C#] Gérer les signaux genre ctrl+c?
    Par BleudeBromothymol dans le forum Windows Forms
    Réponses: 8
    Dernier message: 17/11/2004, 15h32

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