Bonjour,
Je travaille sur un script qui permet de dispatcher l'analyse syntaxique de phrases sur plusieurs machines. Le but est que dès qu'une machine est libre, mon dispatcher lui envoie une phrase à analyser et je veux évidemment que les machines travaillent en même temps. Un serveur d'analyseurs tourne sur chacune des machines et le dispatcher se connecte en tant que client sur ces serveurs.
J'utilise Event pour gérer les événements et le problème que j'ai eu est que l'utilisation de Net::Telnet pour la connexion aux serveurs entraine des opérations d'entrée/sortie bloquantes. A la place de Net::Telnet j'utilise donc directement IO::Socket, mais là problème: lorsque j'essaie de lire ce qui est renvoyé par le serveur sur mon filehandle, la lecture se bloque à la dernière ligne. Il se trouve que la dernière ligne renvoyée par le serveur de parser (ligne de prompt) correspond à ceci (dans le code du serveur):
print MYSTDOUT "Command? ";
Si dans mon dispatcher j'essaie d'imprimer ce qui est récupéré sur mon filehandle:
1 2 3 4
|
while (<$socket>) {
print $_;
} |
Il affiche toutes les lignes sauf la dernière qui contient "Command? " et il semble attendre une fin de ligne qui n'arrive jamais... Il ne me renvoie pas la main.
C'est le même problème si j'essaie d'imprimer avec $socket->getlines().
Voilà mon code:
1 2 3 4 5 6 7 8 9
|
my $socket = IO::Socket::INET->new(Proto => "tcp",
PeerAddr => $host,
PeerPort => $port
)
or die "can't connect to the server of parsers [$host:$port]";
$socket->autoflush(1);
$socket->send("help"); |
Quelqu'un sait-il comment je peux gérer mon prompt ? Cela était facile avec Net::Telnet, qui fournit une commande prompt pour spécifier à quoi ressemble un prompt, mais ici je suis bloquée avec cette fin de ligne manquante.
Cette solution semblait convenir (faire un $socket->print("GET /\015\012"); à la fin du filehandle), mais elle ne résoud pas mon problème.
Partager