Forum Programmation.perl caractères invisibles dans une chaîne (sockets)

Posté par  (site web personnel) .
Étiquettes : aucune
0
3
juil.
2004
Je vais toujours poster le code source du serveur (le client, cest telnet):
#!/usr/bin/perl -w


use strict;
use IO::Socket;

# Usage:
#
# client.pl [ (--exit|-e) <exit string> ] [ ] [ ]
# client.pl [ -h ] [ --help ]

my $filename = "client.pl";
my $help = "
Usage
$filename [ ] [ ]
Options
( -P | --port ) <port number>
Port to listen
( -p | --protocol )
Set a protocol (tcp, udp, ...). Default is \"tcp\"
( -v | --verbose )
Stop verbose mode
( -h | --help )
This help

";


my $verbose = 1;
my $interactive = 0;
my $narg = '';
my $port = '';
my $protocol = 'tcp';

foreach my $arg (@ARGV){
if($arg eq "--port" || $arg eq "-P"){
$narg = '-P';
}elsif($narg eq "-P"){
$port = $arg;
$narg = '';
}elsif($arg eq "--protocol" || $arg eq "-p"){
$narg = '-p';
}elsif($narg eq "-p"){
$protocol = $arg;
$narg = '';
}elsif($arg eq "--help" || $arg eq "-h"){
die $help;
}elsif($arg eq "--verbose" || $arg eq "-v"){
$verbose = 0;
}else{
$port=$arg;
}
}

# if(-e "config.pl"){
# require "config.pl";
# }else{
# $config::port = 593;
# }
#
# $port=$config::port if !$port;

if(!$port){
die "Failure: Need port number\n" if !$interactive;
print "Please enter the port to connect: ";
$port = ;
chomp $port;
}

my $sock = IO::Socket::INET->new(
LocalPort => $port,
Type => SOCK_STREAM,
Reuse => 1,
Listen => 5,
);
die "Failure: $!\n" if !$sock;

print "Listening to ${port}\n" if $verbose;

while(my $client = $sock->accept()){
my $pid = fork;
die "Failure: Can't fork\n" if !defined($pid);

if($pid==0){ # Child
print "New connexion\n" if $verbose;
$client->send("Hi !\n");
$client->send("type \"exit\" and to close connexion.\n");
my $life = 1;
while($life){
my $rep = <$client>;
chomp $rep;
# chop $rep;
my $len = length $rep;
$life=0 if $rep =~ /^exit/;
$client->send("-->".$rep."<--\n*".$len."*\n");
}
}else{
# Nothing to do. Continue loop.
}
}

close($sock);

Le truc qui me gêne; c'est que lorsque j'envoie une chaîne par telnet, je n'arrive pas a enlever les caractères invisibles même avec chomp (suis obligée de faire un chop mais c'est pas très propre ...)
Voici un exemple:

$ telnet localhost 59300

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hi !
type "exit" and <Retu rn> to close connexion.
quelquechose
<--quelquechose
*13*
aaa
<--aaa
*4*
exit
<--exit
*5*
Connection closed by foreign host.

Alors que je voudrais:

Hi !

type "exit" and <Re turn> to close connexion.
quelquechose
-->quelquechose<--
*12*
aaa
-->aaa<--
*3*
exit
-->exit<--
*3*


Comment pourrais-je enlever ce dernier caractère invisible tout es restant compatible avec tous les clients telnet que ce soit sur Windows, MacOS ou dautres unix ...
Merci

Mildred
  • # Il me semble...

    Posté par  . Évalué à 2.

    que chomp supprime ce qui est défini comme INPUT_LINE_SEPERATOR ($/). Redéfinis cette variable pour "manger" plus de caractères que ceux par défaut.

    Ceci étant dit, j'ai eu été un grand fan de perl, mais je le regrette vraiment, mais alors vraiment pas, depuis que je me suis mis à python. Sérieusement.
    • [^] # Re: Il me semble...

      Posté par  (site web personnel) . Évalué à 1.

      Merci ... J'ai réussi a faire ca:
      	my $old = $/;
      	$/ = "\r\n";
      	chomp $l;
      	$/ = "\r";
      	chomp $l;
      	$/ = "\n";
      	chomp $l;
      	$/ = $old;
      mais ce n'est pas encore parfait ...
  • # retour à la ligne

    Posté par  (site web personnel) . Évalué à 2.

    ce que tu cherches c'est enlever les retours à la ligne.

    selon que la plateforme est unix ce sera \n, windows \r\n ou mac \r alors ce qui suit devrait te convenir

    $rep =~ s/\n$//;
    $rep =~ s/\r$//;

    sinon, tu as oublié de quitter après la boucle while ($life) {} (en l'état tu vas te retrouver avec un serveur de plus à chaque fois)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.