Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Prob avec recv de IO::Socket::INET

2 réponses
Avatar
Sébastien Cottalorda
Salut,

Depuis que j'ai migré un programme client TCP vers perl 5.8.0 et Mandrake
9.1, un test sur la commande recv ne fonctionne plus.

La commande :
unless ($socket->recv($data_read,'1024'))
retourne "false" systématiquement, même si je reçois des infos.
Si je n'applique pas le test unless => Ca marche.
Est-ce que quelqu'un a déjà rencontré ce problème.
Ca m'embête de devoir me passer de ce test.

Merci d'avance.

Sébastien


#!/usr/bin/perl -w
use IO::Socket;
use IO::Select;
use strict;
my $end_car="\r";
my $time_out_sending = my $time_out_receiving = 30;
my @recep = &envoie("Hello, How are you","192.168.0.1","45678","");
foreach (@recep){ print "$_\n"}
exit;


sub envoie {
my $to_send = $_[0];
my $adr_ip= $_[1];
my $por = $_[2];
my $socket='';
my $data_read='';
#=========================/ Socket creation \=========================
unless ($socket = IO::Socket::INET->new(PeerAddr=> $adr_ip,
PeerPort=> $por,
Proto=> "tcp",
Timeout=>10,
Type=> SOCK_STREAM))
{
return "Cannot connect to $adr_ip:$por $@";
}
my $s=IO::Select->new();
$s->add($socket);
#==========================/ Sending \================================
if ($s->can_write($time_out_sending)){
unless ($socket->send("$to_send"."$end_car",'')){ #>>>> SENDING
$data_read = "Cannot Send $!";
}
}
else { #------------> Time out <-------------
$data_read = "TIME OUT sending datas";
}
#=========================/ Receiving \===============================
if ($s->can_read($time_out_receiving)){
unless ($socket->recv($data_read,'1024')){ #<<<<< PROB HERE
$data_read = "Cannot Receive $!"; # " "
}
}
else { #------------> Time out <-------------
$data_read = "TIME OUT receiving datas";
}
$s->remove($socket);
close($socket);
return $data_read;
}
--
[ retirer NOSPAM pour répondre directement
remove NOSPAM to reply directly ]

2 réponses

Avatar
Paul GABORIT
À (at) Wed, 10 Sep 2003 16:24:55 +0200,
Sébastien Cottalorda écrivait (wrote):
unless ($socket->recv($data_read,'1024'))
retourne "false" systématiquement, même si je reçois des infos.


Extrait de 'perldoc -f recv' :

Returns the address of the sender if SOCKET's protocol supports this;
returns an empty string otherwise. If there's an error, returns the
undefined value.

Donc le résultat peut-être une adresse, "" ou undef. Or "" et undef sont tous
les deux faux (au sens Perl). Donc tentez :

... unless (defined $socket->recv($data_read, 1024, 0));

(J'ai ajouté la valeur de FLAGS à zéro pour respecter les paramètres.)

PS: Je n'ai pas testé ;-)

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>
Remove '.OOO' from e-mail address - Supprimez '.OOO' de l'adresse e-mail

Avatar
Sébastien Cottalorda
Paul GABORIT wrote:


À (at) Wed, 10 Sep 2003 16:24:55 +0200,
Sébastien Cottalorda écrivait (wrote):
unless ($socket->recv($data_read,'1024'))
retourne "false" systématiquement, même si je reçois des infos.


Extrait de 'perldoc -f recv' :

Returns the address of the sender if SOCKET's protocol supports
this;
returns an empty string otherwise. If there's an error, returns
the undefined value.

Donc le résultat peut-être une adresse, "" ou undef. Or "" et undef sont
tous les deux faux (au sens Perl). Donc tentez :

... unless (defined $socket->recv($data_read, 1024, 0));

(J'ai ajouté la valeur de FLAGS à zéro pour respecter les paramètres.)

PS: Je n'ai pas testé ;-)



Merci beaucoup, ça remarche maintenant.

Sébastien

--
[ retirer NOSPAM pour répondre directement
remove NOSPAM to reply directly ]