Bonjour,

J'ai un script qui se connecte à un serveur et lit ce qui est renvoyé via IO::Socket. Parfois il me renvoie "Timed Out". Ce que je voudrais faire, c'est lire la première ligne renvoyée par le serveur pour vérifier si ce n'est pas 'Timed Out". Mais le problème est que si je lis la première ligne, elle est automatiquement effacée du FileHandle, ce qui me pose problème lorsque je dois traiter les données dans les cas où il n'y a pas de timeout...

Comment lire cette première ligne sans l'effacer ?

Par défaut autoflush est activé et je ne sais pas comment le désactiver. Voilà mon code:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
    # connexion au serveur (je n'utilise pas timeout avec io::socket car
    # il se fait uniquement sur la connexion et pas sur les entrées/sorties !)
    my $socket = IO::Socket::INET->new(Proto     => "tcp",
				       PeerAddr  => $host,
				       PeerPort  => $port,
	)
	or die "can't connect to the server of parsers [$host:$port]";
 
(...)
 
## envoi de la commande sur le serveur
sub send_cmd {
    my ($self, $cmd) = @_;
    print $socket $cmd;
 
    $socket->autoflush(0);  # désactive autoflush ?
    if (<$socket> =~ /Timed Out/) { # problème: ça aspire toujours la 1ère ligne !
	print "time out!\n";
        # todo: faire ce qu'il faut en fonction du time out
    }
 
    $socket->autoflush(1); # réactiver autoflush
}
Comme j'ai tout un tas de traitements différents à faire sur ce qui m'est renvoyé, selon un statut, je dois vraiment vérifier cette ligne en amont et pas à chaque fois que je traite les données, sinon je devrais avoir à multiplier la même vérification au début de chaque phase. De plus, je ne veux pas renvoyer tout ce qui est sur $socket dans une liste (ce qui permettrait de vérifier la 1ere ligne sans l'enlever), car les données renvoyées par le serveur sont souvent volumineuses et donc je veux les traiter à la volée en lisant $socket au fur et à mesure.