[C++] Communiquer avec une fenêtre Telnet

Fermé
Utilisateur anonyme - 12 mai 2009 à 09:41
Mrlucky Messages postés 2 Date d'inscription mercredi 6 octobre 2010 Statut Membre Dernière intervention 7 octobre 2010 - 7 oct. 2010 à 15:58
Bonjour,

J'ai créé en C++ une fenêtre telnet grâce à la commande System("telnet");
La fenêtre s'ouvre, tout va bien... cependant, une fois la fenêtre ouverte, impossible de communiquer avec elle!

J'ai certaines connaissances en C mais je débute en langage orientée objet.
Je suppose qu'au lieu d'utiliser System(...), je devrais plutôt crée un objet telnet et essayer de communiquer avec l'objet en utilisant des méthodes mais je ne suis vraiment pas à l'aise avec les objets...

Si quelqu'un à un début de solution afin de me mettre sur la piste...

Merci d'avance et bonne journée à tous.

10 réponses

Utilisateur anonyme
12 mai 2009 à 11:45
Je ne comprend pas quand tu dis "communiquer avec une fenêtre"
0
Utilisateur anonyme
12 mai 2009 à 11:58
Je veux dire, une fois que la fenêtre est ouverte, envoyé des commandes et récupérer les réponses. Je donne un exemple tout bête:
la connexion telnet est faite mais il demande un login et un mot de passe, il faut que le programme C++ entre ce login et ce mot de passe. Si telnet répond quelque chose, par exemple l'état d'une imprimante, il faut que mon prog puisse le récupérer pour l'afficher. En somme, il faut que mon programme puisse lire et écrire dans la fenêtre telnet.
J'espère que c'est plus clair, c'est pas évident à expliquer...

0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
12 mai 2009 à 12:11
Salut.
Je ne pense pas que ça soit faisable si facilement.
system passe une chaine de caractère au shell, il ne redirige pas les entrées sorties.
Si tu veux pouvoir écrire sur l'entrée standard de telnet tu peut essayé popen() à la place de system(). Mais je ne suis pas sur que ça fonctionne car il me semble que telnet protège stdin (je ne sais plus par quel mécanisme).
Je pense que le mieux c'est de récupérer les sources d'un client telnet et de l'incorporer dans ton programme.
0
Utilisateur anonyme
12 mai 2009 à 12:18
Jette un coup d'oeil aux fonctions popen et pclose de stdio.h. Mais comme le dit Char Snippeur, avec telnet je pense pas que ça marche. Mais qui en tente rien à rien ^^. Tiens nous au courant !

  char commande[16] = "dir";
  char buffer[256]; 
  FILE *ptr;
 
  if ((ptr = popen(commande, "r")) != NULL)
  {
    while (fgets(buffer, 256, ptr) != NULL)
    {
      fprintf(stdout, "%s", buffer);
      fflush(stdout); 
    }
    pclose(ptr);
  }
  else
  {
    fprintf(stderr, "Impossible d'executer cette commande \n");
  }
0
Utilisateur anonyme > Utilisateur anonyme
12 mai 2009 à 13:28
Les connexions Telnet visent un serveur Unix mais l'ordinateur sur lequel on lance les connexions sont sous Windows XP et apparemment popen et pclose ne fonctionnent que sur linux.
0
Utilisateur anonyme > Utilisateur anonyme
12 mai 2009 à 13:43
En fait sous Windows c'est _popen et _pclose =) je viens de tester et ça marche bien =)

#include <stdio.h>
#include <iostream>
#include <stdlib.h> 
int main(void)
{
char commande[16] = "dir";
  char buffer[256]; 
  FILE *ptr;
 
  if ((ptr = _popen(commande, "r")) != NULL)
  {
    while (fgets(buffer, 256, ptr) != NULL)
    {
      fprintf(stdout, "%s", buffer);
      fflush(stdout); 
    }
    _pclose(ptr);
  }
  else
  {
    fprintf(stderr, "Impossible d'executer cette commande \n");
  }

  system("pause");

return 0;
}
0
Il ne faut jamais utiliser system() sous windows.
Telnet se fait notamment par les apis Win32 (demander sur le groupe pro Win32 https://groups.google.com/forum/?hl=fr#!forum/fr.comp.os.ms-windows.programmation par Google )
0
Utilisateur anonyme
12 mai 2009 à 15:59
Au lieu de me dire de ne pas utiliser system pour faire une simple pause pour que la fenêtre ne se referme pas, propose quelque chose qui est en rapport avec la question posée, ton commentaire n'apporte rien !

Ou bien c'était pour le system("telnet") dans le 1er commentaire et dans ce cas je n'ai rien dit XD

Les API Win32 c'est VB etc... ?? si c'est ça, c'est vrai que c'est plus "visuel" et plus simple à coder. Après il est peut être obligé de passer en c++ pour faire d'autres choses ...
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
12 mai 2009 à 15:27
On utilise system() si on veux d'abord !
Et plutôt que de passer par l'usine à gaz des API, autant prendre une source de client.
Pourquoi cherche tu à faire ça exactement ?
0
Utilisateur anonyme
13 mai 2009 à 10:50
On a une série d'imprimantes gérées par Unix dans mon entreprise et ceux-ci se bloquent tout le temps au bout d'un moment. Pour les débloquer, il faut se connecter avec telnet sur le serveur Unix et effectuer une série de commandes assez contraignante dans la fenêtre Telnet.
L'idée serait de réaliser un petit prog qui automatise le débloquage des imprimantes en question.
On aurait alors un petit menu (console pour débuter) qui permettrait une fois l'imprimante choisie de voir l'état de l'imprimante (READY, SENDING et DOWN selon les cas), d'avoir accès au spool Unix de l'imprimante (pour pouvoir supprimer le ou les jobs qui éventuellement coincent l'imprimante), de pouvoir désactiver et activer l'imprimante (ce qui la décoince dans le cas où se n'est pas un job le responsable).

Le but serait donc de faciliter la maintenance des imprimantes. J'aimerai faire un petit prog console en C++ pour commencer puis si le prog fonctionne et que son utilité est avérée, je programmerai une petite interface graphique avec QT.

Il faut donc que je sois capable de communiquer avec la fenêtre Telnet en question (grâce à system() je peux ouvrir une connexion Telnet sur le serveur mais ensuite pas moyen de communiquer avec la fenêtre ouverte).

Merci d'avance
0
Utilisateur anonyme > Utilisateur anonyme
13 mai 2009 à 11:00
As-tu regardé mon commentaire 6 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
13 mai 2009 à 11:57
Oui, j'ai vu. C'était pour répondre à Char Snipeur.
J'essai tout de suite.
0
Utilisateur anonyme
13 mai 2009 à 12:14
Si j'ai bien compris, une fois la fenêtre ouverte, pour envoyer d'autres commandes, on écrit dans le descripteur de fichier ptr ?
0
Utilisateur anonyme
13 mai 2009 à 12:25
Tu utilises _popen en mode écriture "w", fais des essais

Il me semble que tu ne peux pas avec _popen établir une communication bidirectionnelle.

Donc il faut les enchainer...

C'est quand même compliquer en C++ et mes compétences se limite ici :S

J'ai trouvé ça (incompréhensible XD) !! https://docs.microsoft.com/en-us/windows/win32/procthread/creating-a-child-process-with-redirected-input-and-output?redirectedfrom=MSDN
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
13 mai 2009 à 12:55
D'accord avec ahmet, c'est compliqué en C++. Pour manipulé telnet, j'avais vu une discussion disant, si je me souviens bien, qu'avec perl et un certain module, c'était super facile.
Il n'existe pas un service UNIX permettant la gestion des imprimante à distance ? à poser dans le forum unix comme question.

Une autre possibilité, qui serait peut être mieux point de vue sécurité, c'est de créer ton propre serveur.
En C/C++ sur UNIX tu fait un petit serveur qui manipule les imprimantes, et qui dialogue avec le client par de simples instruction.
Si tu vois ce que je veux dire. ça peut être une solution simple si le pipe ne fonctionne pas et que tu ne veux pas bricolé les sources d'un client telnet.
0
Utilisateur anonyme
13 mai 2009 à 13:23
C'est à dire que je ne peux pas vraiment modifier le système actuel. J'ai pensé à une interface qui se sert du système actuel d'où la communication telnet avec C++. Maintenant je peux manier d'autres langages, peut-être qu'avec le VB (VBA) ce serait plus simple ...
0
Utilisateur anonyme
13 mai 2009 à 13:43
Oui pourquoi pas Visual Basic, mais il faut installer une certaine version du Framework pour l'exécuter, pas stable et la programmation avec ce langage ne ressemble à rien =)

Sinon en JAVA avec uniquement un JAR, tu peux l'exécuter où tu veux. L'avantage est que le JAVA est portable, donc il tourne aussi bien sous Windows que sous UNIX ... OK il faut installer Java, mais en général java est déjà installé dans les machines.

Avec un petit shell combiné à du Java ?
http://www.javafr.com/...
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
13 mai 2009 à 14:05
0
Utilisateur anonyme
13 mai 2009 à 14:20
oui pourquoi pas !
0
Mrlucky Messages postés 2 Date d'inscription mercredi 6 octobre 2010 Statut Membre Dernière intervention 7 octobre 2010
7 oct. 2010 à 15:58
salut tout le monde,
je suis aussi entrain d'écrire un programme qui a pour but de rebouter mon routeur et j'ai la même problème.
j'ai essayer de simuler les touche pour entrer le user et le pass mais sa marche pas. impossible de communiquer avec telnet.
je voudrait savoir si vous avez trouvez une solution.
0