sequencement socket lié a un formulaire

sequencement socket lié a un formulaire - PHP - Programmation

Marsh Posté le 20-12-2007 à 16:07:09    

j'utilise une classe pr faire faire un connection telnet mais j'ai un probleme, je veu créer un formulaire avec 2champs mais on dirait que ça marche pas coté séquencement des information, mais si j'utilise pas le formulaire ça marche.
voici le code sans formulaire:

Code :
  1. $hostname = "192.168.2.1";
  2. $tn = new telnet($hostname,23);
  3. sleep(2);
  4. echo $tn->read_till("> " );
  5. $tn->write("sh int" );
  6. echo $tn->read_till("> " );
  7. $tn->write("sh conf" );
  8. echo $tn->read_till("> " );
  9. echo $tn->close();


celui la ça marche impécable mais c'est pas pratique pour mettre a chaque fois la commande de façon statique et le deuxieme aussi marche mais pas de façon a lire les données d'une façon continue de la socket(on dirait qu'il réinitialise la socket parès chaque submit)

Code :
  1. $loginprompt='>'
  2. $hostname = "192.168.2.1";
  3. $tn = new telnet($hostname,23);
  4. if(isset($_POST['command']) && !empty($_POST['command']))
  5. {
  6. $tn->write($_POST['command']."\r\n" );
  7. sleep(2);
  8.       if (($_POST['command']=='enable') || ($_POST['command']=='en'))
  9.        {
  10.    $loginprompt="#";
  11.    $tn->write($mdp);
  12.            sleep(2);
  13.  
  14.        } 
  15. $resultat.=tn->lire_juska($loginprompt);
  16. sleep(2);
  17. }
  18. $_SESSION['resultat'].=$resultat;
  19. ?>
  20. <form name="saisie" method="post" action="<?php $PHP_SELF ?>">
  21. <input type="text" name="command" size="60">
  22. <textarea cols="80" rows="20" name="result" style="overflow:visible" readonly="readonly" id="area"><?php echo $_SESSION['resultat']; ?></textarea>
  23. </form>


je bloque vraiment svp un peu d'aide :pfff:

Reply

Marsh Posté le 20-12-2007 à 16:07:09   

Reply

Marsh Posté le 20-12-2007 à 16:39:23    

pas très clair tout ça, et elle sort d'où cette classe telnet ??

fattouch_squall a écrit :

(on dirait qu'il réinitialise la socket parès chaque submit)

normal si tu n'utilises pas de connexion persistante

Reply

Marsh Posté le 20-12-2007 à 16:56:42    

Code :
  1. class Telnet {
  2.         var $sock = NULL;
  3.         function telnet($host,$port) {
  4.         $this->sock = fsockopen($host,$port);
  5.                 socket_set_timeout($this->sock,2,0);
  6.         }
  7.     function close() {
  8.         if ($this->sock)
  9.             fclose($this->sock);
  10.         $this->sock = NULL;
  11.         }
  12.     function write($buffer) {
  13.                 $buffer = str_replace(chr(255),chr(255).chr(255),$buffer);
  14.         fwrite($this->sock,$buffer);
  15.         }
  16.         function getc() {
  17.                 return fgetc($this->sock);
  18.         }
  19.     function read_till($what) {
  20.         $buf = '';
  21.                 while (1) {
  22.                         $IAC = chr(255);
  23.                         $DONT = chr(254);
  24.                         $DO = chr(253);
  25.                         $WONT = chr(252);
  26.                         $WILL = chr(251);
  27.                         $theNULL = chr(0);
  28.                         $c = $this->getc();
  29.                         if ($c === false)
  30.                           return $buf;
  31.                         if ($c == $theNULL) {
  32.                                 continue;
  33.                         }
  34.                         if ($c == "\021" ) {
  35.                                 continue;
  36.                         }
  37.                         if ($c != $IAC) {
  38.                                 $buf .= $c;
  39.                                 if ($what == (substr($buf,strlen($buf)-strlen($what)))) {
  40.                                         return $buf;
  41.                                 } else {
  42.                                         continue;
  43.                                 }
  44.                         }
  45.                         $c = $this->getc();
  46.                         if ($c == $IAC) {
  47.                                 $buf .= $c;
  48.                         } else if (($c == $DO) || ($c == $DONT)) {
  49.                                 $opt = $this->getc();
  50.                         // echo "we wont ".ord($opt)."\n";
  51.                                 fwrite($this->sock,$IAC.$WONT.$opt);
  52.                         } elseif (($c == $WILL) || ($c == $WONT)) {
  53.                                 $opt = $this->getc();
  54.                         // echo "we dont ".ord($opt)."\n";
  55.                                 fwrite($this->sock,$IAC.$DONT.$opt);
  56.                         } else {
  57.                         // echo "where are we? c=".ord($c)."\n";
  58.                         }
  59.                 }
  60.         }
  61. }


voici la classe comment je fait pour etablir une connexion persistante pour le formulaire?


Message édité par fattouch_squall le 20-12-2007 à 17:25:04
Reply

Marsh Posté le 20-12-2007 à 17:30:25    

Je résume :
1) t'as une page web avec un formulaire
2) t'as un script qui ouvre une connexion telnet et fait suivre ce qui est demandé
3) tu constates que la connexion telnet se coupe à chaque fois et que le script en ouvre une nouvelle à chaque fois que tu veux faire quelque chose.
 
Je te rassure, c'est un comportement qui est tout à fait logique. Les sites web ne sont pas des logiciels a connexion persistantes. Entre chaque demande de page, c'est une nouvelle connexion qui est créé et à chaque demande de page, c'est une nouvelle instance des scripts qui est exécuté.
 
Au niveau de php, ce qui se passe, c'est qu'à chaque fois que tu valides ton formulaire, tu demandes au serveur d'exécuter ton script php. Ce script ouvre une connexion avec le serveur telnet, ensuite il fait suivre ce que tu as demandé, t'affiche le résultat et se termine. Quand il se termine, le programme php fait le grand ménage et ferme toutes les ressources (fichiers, connexion réseaux, ...) qui ont été ouverte mais qui n'ont pas été fermé explicitement. La connexion au serveur telnet est donc tué à chaque fois (de toute manière, elle n'aurait pas pu être réutilisé plus tard)
 
La seule manière que t'as de contourner ça, c'est d'ouvrir une session php pour y stocker la liste des ordres déjà demandé jusqu'à présent et de les réexécuter à chaque fois pour retomber (s'il n'y a pas eu de changement sur le serveur) dans l'état voulut et que la nouvelle commande fasse ce qu'on voulait.
 
PS : En l'espace de 15 jours, t'es le second à avoir exactement ce problème là et tous les deux c'est pour une connexion telnet. Vous êtes dans la même classe et c'est votre projet à rendre pour bientôt?

Reply

Marsh Posté le 20-12-2007 à 17:37:55    

j'ai essayé en changeant la variable $tn par $_SESSION['telnet'] et ça marche pas, je doit faire quoi en plus de ça??

Reply

Marsh Posté le 20-12-2007 à 17:58:37    

Tu ne peux pas ouvrir une connexion réseau à l'appel d'une page web et la garder ouverte pour l'appel de la page suivante.
Même si tu stockes l'identifiant de ressource dans une variable de session, même si tu essayes de sérialiser le contenu de la variable tu arriverais au même résultat : te retrouver avec une connexion fermé.
 
Je t'ai donné plus haut la seule solution valable dans le cadre d'un site web.
 
 
PS : SI c'est juste pour l'utiliser en local alors tourne toi vers GTK/PHP et fait toi une application (avec interface graphique) que tu lances directement ce qui te permettra d'avoir des connexions réseaux qui ne sont pas fermé jusqu'à ce que tu quittes ton application. Mais attention, dans ce cas c'est juste pour du local, ça ne marchera pas comme attendu si tu l'installes sur un serveur web.


Message édité par omega2 le 20-12-2007 à 18:00:59
Reply

Marsh Posté le 20-12-2007 à 18:12:44    

mon application va etre utilisé sur un réseau local pour faire la config a distance des routeur , si je peux basculer vers GTK/PHP est ce facile d'adapter mon code car j'ai plus de tems sinon j'ai pas trop saisie ta solution?

Reply

Marsh Posté le 20-12-2007 à 18:29:51    

Heu ... petite question en passant, après vérification c'est pas deux personnes qui avaient ce problème mais toi il y a environ 1 mois et à nouveaux toi maintenant. Qu'est ce que t'as appris en php pendant les 20 jours qui se sont écoulé depuis la clôture de ton ancienne discussion?

Reply

Marsh Posté le 20-12-2007 à 18:47:50    

mon application est bel et bien terminer, j'arrive a utiliser les variable de session mais il me reste ce probleme la.

Reply

Marsh Posté le 20-12-2007 à 18:50:25    

je veux de l'aide que sur celui la, comment lire de et introduire des commande dans la même socket sans qu'elle soit fermé a chaque regénération, une petite demonstration en pratique ça m'aide bcp svp.

Reply

Marsh Posté le 20-12-2007 à 18:50:25   

Reply

Marsh Posté le 20-12-2007 à 18:58:25    

On ne peut pas. C'est php qui ferme la connection réseau et on ne peut pas l'éviter quand on bosse sur un site web (ça t'as déjà été expliqué x fois la dernière fois).
 
Pour le coup de faire une application php lancé en local (donc pas en passant par un site web) ça nécessite des changements plus important que de simplement stocker les différentes commandes en session et les réexécuter à chaque fois. Si tu manques de temps alors que ton programme est quasiment finis alors va au plus simple.

Reply

Marsh Posté le 20-12-2007 à 20:12:48    

n'ya t-il pas aucun moyen de faire un formulaire sans regénérer ma page, je seré blqué si je parvient pas a maintenir la socket ouverte.(ajax ça aide pas) et ça nécessité combien de temps pr changer ça en php/GTk???

Reply

Marsh Posté le 20-12-2007 à 22:14:53    

Citation :

La seule manière que t'as de contourner ça, c'est d'ouvrir une session php pour y stocker la liste des ordres déjà demandé jusqu'à présent et de les réexécuter à chaque fois pour retomber (s'il n'y a pas eu de changement sur le serveur) dans l'état voulut et que la nouvelle commande fasse ce qu'on voulait.


 
si vous pouvez svp expliquer moi ça un peu en pratique, ça me vient rien a l(esprit car je comprend pas bien la solution??


Message édité par fattouch_squall le 20-12-2007 à 22:16:12
Reply

Marsh Posté le 21-12-2007 à 02:42:59    

T'as visiblement toujours pas compris l'environnement dans lequel tu bosses... Et pourtant Omega2 a eu la patience de tout te réexpliquer très clairement ici!
 
Essayes d'y mettre un peu de bonne volontée ;)
 
Parce que je suis de bonne humeur je te donne quelques pistes: connexion persistente (pfsocketopen) et la linéarisation d'une instance de classe dans une session ici

Reply

Marsh Posté le 21-12-2007 à 09:08:17    

merci a vous tous pour votre aide c'est bon ce les piste que m'a donné leflos5 et omega2 m'ont été bien utile merci encore une fois :D

Message cité 1 fois
Message édité par fattouch_squall le 21-12-2007 à 09:08:57
Reply

Marsh Posté le 18-09-2008 à 18:03:51    

fattouch_squall a écrit :

merci a vous tous pour votre aide c'est bon ce les piste que m'a donné leflos5 et omega2 m'ont été bien utile merci encore une fois :D


 
Bonjour,
 
J'ai le même problème :
 
J'ai trouvé la fonction afin d'avoir la connexion persistante d'une socket. J'aimerais passer la ressource dans une variable de session ; pour cela j'ai utilisé serialize() et unserialize() mais ça ne marche toujours !
J'ai vraiment l'impression que ce n'est pas possible ; pourtant tu dis que tu as réussi ...  
 
Peux-tu partager ta solution stp ?  
 
Merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed