Bonjour,
je rencontre des problemes pour lire des donnes sur un filehandle en utilisant une reference vers celui ci (en C - perl embed). La fonction perl en question recoit un scalaire représentant une socket (deja ouverte du cote C de l'appli), et affiche sur la sorte standard ce que la socket recoit (le tout sans utiliser le module Socket). C'est un serveur. Le code suivant fonctionne bien:
#!/usr/bin/perl -w
##
use strict;
sub player_talk($)
{
$socket = shift;
return 0 if (!open SH, "<&" . $socket);
my $input = <SH>;
if (!$input)
{
close SH;
return -1;
}
print "[socket $socket] $input";
close SH;
return 1;
|
Mais je trouve un peu lourd de rouvrir et refermer le filehandle (SH) de la socket chaque fois qu'il y a une donnee a lire. Je prefere stocker une reference vers le filehandle et l'utiliser si on a deja lu sur la socket auparavant:
#!/usr/bin/perl -w
##
use strict;
my %sockets = ();
sub player_talk($)
{
my $socket = shift;
my $sh;
if (!exists $sockets{$socket})
{
return 0 if (!open SH, "<&" . $socket);
$sh = \*SH;
$sockets{$socket} = $sh;
}
else
{
$sh = $sockets{$socket};
}
my $input = <*$sh>;
if (!$input)
{
delete $sockets{$socket};
close *$sh;
return -1;
}
print "[socket $socket] $input";
return 1;
}
|
Au niveau du code je ne vois pas ce qui pose probleme dans cette version, pourtant en testant avec telnet, j'obtiens des resultats etranges (le serveur ne recoit rien sur la socket au bout de la deuxieme lecture, déconnexions sans raison... je detaillerai au besoin
). En remplacant <> par readline(), des erreurs similaires, mais en tout cas ca ne fonctionne pas non plus.
Quelquechose doit m'echapper, mais je vois pas. Des idees?
Merci d'avance!