Attendre un instant avant de reprendre

Attendre un instant avant de reprendre - Perl - Programmation

Marsh Posté le 14-03-2004 à 22:58:19    

Bonsoir,
Dans un script perl, plus précisément une fonction, je tente une connexion vers un serveur. Et juste après cette connexion, je souhaiterais exécuter des commandes.
 
Comme le temps de connexion est toujours le même, je pensais faire attendre l'exécution du programme pendant x secondes. Mais je n'arrive pas à le faire..
 
J'ai matté la doc de sleep, wait et perlipc pour le SIGALRM mais c'est visiblement pas ce que je cherche..
 
Une idée ?


---------------
Membre du Front de Libération de Datoune | Soutenez le FLD | A Tribute To Datoune
Reply

Marsh Posté le 14-03-2004 à 22:58:19   

Reply

Marsh Posté le 14-03-2004 à 23:06:31    

je comprends pas trop ce que tu veux
 
Si tu fais une connexion et qu'elle prend un certain temps, alors la fonction qui la suit attendra naturellement que cette connexion soit etablie (c'est à dire que la focntion de connexion retroune qq chose) avant de s'executer.
 
Sinon pour faire une "pause" c'est effectivement sleep(X) qu'il faut utiliser.
Si ca foire pour une raison obscure tu peut essayer select(undef,undef,undef,X) avec eventuellement un X à virgules.
 
Maintenant il se peut que ton probleme soit juste un probleme d'affichage qui ne s'effectu pas la ou tu pense qu'il devrait s'effectuer? Par defaut dans perl 5.8 l'affichage à 'lecran par print est bufferisé et n'est effectué qu'à chaque "\n".
 
Donc met un $|=1 au debut de ton script pour que l'affichage soit immediat à chaque print

Reply

Marsh Posté le 15-03-2004 à 13:07:45    

je ne saisis pas très bien non plus la question, mais je vois peut-être ce que tu veux :
La fonction de connexion peut être non bloquante et donc elle retournera quelquechose alors que la connexion n'est pas encore terminée. Il faut alors attendre un certain temps avant d'écrire dans la socket.
Si c'est ce que tu veux faire, tu peux utiliser IO::Select :
 

Code :
  1. @ready = IO::Select->new($handle)->can_read();


 
Cette ligne attendra que la socket $handle soit prête en lecture (can_write pour l'écriture). Tu peux aussi spécifié un temps max d'attente en argument à can_read.
N'oublie pas le 'use IO::Select'.

Reply

Marsh Posté le 15-03-2004 à 13:43:36    

la connexion est toujours bloquante. Pour passer une socket en non bloquant il faut deja avoir ce socket, et donc avoir fait un new sur IO::Socket qui va etablir la connexion et bloquer comme un porc (meme au dela du time out sous Windows, meme avec des alarm ou quoi que ce soit d'autre). D'ailleurs le passage en non bloquant du socket ne marche pas sous windows, il faut le faire à la main avec un truc du genre ioctl( $sock, 0x80000000 | (4 << 16) | (ord('f') << 8) | 126, 1) || return 0;
 
La solution pour un connexion astnchrone serait peut etre d'utiliser le nouveau module Net-NBsocket et sa fonction $client = connect_NB($port_path,$netaddr);, mais la non plus je ne sais pas si ca marche sous windows...
 
De toute facon pourkoi vouloir faire un truc asynchrone alors qu'il veut justement un truc synchrone, et que c'est le comportement par defaut?

Reply

Marsh Posté le 15-03-2004 à 17:55:29    

Ok je savais pas ces détails, merci pour l'info. D'un autre côté il n'est peut-être pas sous Linux, mais je suis d'accord sur le fait que je ne vois pas l'interêt de la chose. Mais que veut-il alors ? :pt1cable:

Reply

Marsh Posté le 15-03-2004 à 19:43:01    

Merci à vous, mais vous êtes aller chercher beaucoup trop loin.
Je débute en perl, et en fait il s'agit seulement d'un script fait en perl pour irssi.
 
Je ne me connecte pas directement via perl, c'est par l'intermédiaire d'une commande irssi/IRC (/server irc.bla.org) que je me connecte au serveur. Bref, en gros, j'aimerais, qu'une fois la connexion établie sur le serveur, je puisse à nouveau exécuter des commandes irssi (/join #channel par exemple).
 
Seulement comment savoir quand cette connexion est établie ?
Je pensais au début attendre qq seconde (puisque le temps de connexion est toujours le même) mais c'est pas la bonne solution !


---------------
Membre du Front de Libération de Datoune | Soutenez le FLD | A Tribute To Datoune
Reply

Marsh Posté le 15-03-2004 à 22:23:43    

t'as pas le moyen de tester si t'es bien connecté? Il se passe koi si tu commence avant d'etre connecté?

Reply

Marsh Posté le 15-03-2004 à 22:56:25    

Justement, je vois pas comment faire. Parce qu'une fois que la connexion s'établie, le serveur renvoie plein de messages mais c'est par l'intermédiaire d'irssi, donc je sais pas si c'est possible de faire savoir à ce script que la connexion est belle est bien finie.
 
Ou alors il faudrait une commande internet à rissu du genre /connected qui renvoie 0 pour non connecté et 1 pour connecté.
 
Si je commence avant d'être connecter, bin les commandes servent à rien car ces commandes sont liées au serveur (sous entendu il faut être connecté au serveur pour les éxécuter sinon elles servent à rien).


---------------
Membre du Front de Libération de Datoune | Soutenez le FLD | A Tribute To Datoune
Reply

Marsh Posté le 16-03-2004 à 09:23:13    

Ben je peux difficilement t'aider pasque je connais pas irssi
il les renvoi ou ses messages le serveur?
 
Ya forcement une facon de faire "normale" qui inclue un samblant de synchronisation

Reply

Marsh Posté le 16-03-2004 à 11:53:46    

bin il les balance dans le programme en sortie et ça s'affiche sur l'écran...
 
M'enfin sinon c'est pas grave, je pense que je vais trouver en mattant les sources de scripts perl pour irssi :jap:


---------------
Membre du Front de Libération de Datoune | Soutenez le FLD | A Tribute To Datoune
Reply

Marsh Posté le 16-03-2004 à 11:53:46   

Reply

Marsh Posté le 16-03-2004 à 12:50:16    

tu peux pas rediriger la sortie dans un fichier que tu analyserais avec Perl ?(c'est un peu crade c'est vrai)

Reply

Marsh Posté le 16-03-2004 à 12:58:12    

C'est une idée en effet, à voir.


---------------
Membre du Front de Libération de Datoune | Soutenez le FLD | A Tribute To Datoune
Reply

Marsh Posté le 01-04-2004 à 15:50:44    

vanilla a écrit :


Je débute en perl, et en fait il s'agit seulement d'un script fait en perl pour irssi.
 
Je ne me connecte pas directement via perl, c'est par l'intermédiaire d'une commande irssi/IRC (/server irc.bla.org) que je me connecte au serveur. Bref, en gros, j'aimerais, qu'une fois la connexion établie sur le serveur, je puisse à nouveau exécuter des commandes irssi (/join #channel par exemple).
 


 
Une technique assez souvent utilisée pour ce genre de temporisation
est d'attendre la fin du motd (désolé j'ai plus le code en tête
faut chercher un peu :)
Une fois reçu cet événement tu es certain d'être connecté et de
pouvoir commencer à /join qqpart.
 
--  
David "Sniper" Rigaudiere
Les mongueurs de Perl - http://www.mongueurs.net
Les journées Perl 2004 - http://conferences.mongueurs.net/2004

Reply

Marsh Posté le 02-04-2004 à 19:17:13    

Merci !

Reply

Sujets relatifs:

Leave a Replay

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