OVH Cloud OVH Cloud

Socket et acquittement

5 réponses
Avatar
lasconic
Bonjour !
Une petite question bete mais qui me turlupine ...
Je veux envoyer un message via un socket et j'aimerai attendre un
acquittement pendant un certain temps seulement. Ouvrir le socket je
vois a peu pres et yecrire aussi mais pour attendre la reponse un
certain temps ? ? ?


sub sendMessage{
my ($ip_address, $message)=@_;
my $socketResponse = IO::Socket::INET->new(PeerAddr => $ip_address,
PeerPort => 2048,
Proto => "tcp",
Type => SOCK_STREAM)
or die "Couldn't connect to $ip_address:2048: $@\n";
print $socketResponse $message;
############### C ici qu'il manque un truc ??!!!! ################

close $socketResponse;
}

5 réponses

Avatar
no
On Wed, 14 Apr 2004 13:51:57 +0200, lasconic wrote:

Bonjour !
Une petite question bete mais qui me turlupine ... Je veux envoyer un
message via un socket et j'aimerai attendre un acquittement pendant un
certain temps seulement. Ouvrir le socket je vois a peu pres et yecrire
aussi mais pour attendre la reponse un certain temps ? ? ?


sub sendMessage{
my ($ip_address, $message)=@_;
my $socketResponse = IO::Socket::INET->new(PeerAddr => $ip_address,
PeerPort => 2048,
Proto => "tcp",
Type => SOCK_STREAM)
or die "Couldn't connect to $ip_address:2048: $@n";
print $socketResponse $message;
############### C ici qu'il manque un truc ??!!!! ################

close $socketResponse;
}
}


Je ne sais pas si c'est bien propre mais j'ai eu fait ça :

--8<--
# juste au dessus on forke, et on est donc dans le fils
# qui va traiter la demande du client, pendant que le père
# poursuit son écoute pour de nouvelles requetes

local $SIG{ALRM} = sub {
print STDERR "Delai d'attente expiré, on ferme !n";
close $socketResponse;
exit;
}

# on donne 5 minutes au client pour répondre...
alarm 5*60;

$response = <$socketResponse>;

# des qu'on a la réponse on peut désactiver le timeout.
alarm 0;
-->8--

Avatar
no
On Wed, 14 Apr 2004 21:24:44 +0200, no wrote:

Je ne sais pas si c'est bien propre mais j'ai eu fait ça :
[snip]


C'est surtout parti de travers :/

# juste au dessus on forke, et on est donc dans le fils
# qui va traiter la demande du client, pendant que le père
# poursuit son écoute pour de nouvelles requetes

local $SIG{ALRM} = sub {
print STDERR "Delai d'attente expiré, on ferme !n";
close $socketResponse;
exit;
}

# on donne 5 minutes au client pour répondre...
alarm 5*60;

$response = <$socketResponse>;

# des qu'on a la réponse on peut désactiver le timeout.
alarm 0;

Avatar
no
On Wed, 14 Apr 2004 21:27:36 +0200, no wrote:

On Wed, 14 Apr 2004 21:24:44 +0200, no wrote:

Je ne sais pas si c'est bien propre mais j'ai eu fait ça : [snip]


C'est surtout parti de travers :/



Bon, là j'abandonne :) Je vous laisse remettre les retour chariot ou il
faut... /o


Avatar
Sébastien Cottalorda
lasconic wrote:

Bonjour !
Une petite question bete mais qui me turlupine ...
Je veux envoyer un message via un socket et j'aimerai attendre un
acquittement pendant un certain temps seulement. Ouvrir le socket je
vois a peu pres et yecrire aussi mais pour attendre la reponse un
certain temps ? ? ?


sub sendMessage{
my ($ip_address, $message)=@_;
my $socketResponse = IO::Socket::INET->new(PeerAddr => $ip_address,
PeerPort => 2048,
Proto => "tcp",
Type => SOCK_STREAM)
or die "Couldn't connect to $ip_address:2048: $@n";
print $socketResponse $message;
############### C ici qu'il manque un truc ??!!!! ################

close $socketResponse;
}


Salut,
tu peux utiliser IO::Select.
L'avantage c'est qu'il est portable aussi bien sous Linux que sous Windows.

#----------------------------------------------------------------------------
use IO::Select;
my $s=IO::Select->new();
my $timeout;


sub sendMessage{
my ($ip_address, $message)=@_;
my $socketResponse = IO::Socket::INET->new(PeerAddr => $ip_address,
PeerPort => 2048,
Proto => "tcp",
Type => SOCK_STREAM)
or die "Couldn't connect to $ip_address:2048: $@n";
$s->add($socketResponse); # laisse IO::Select gérer ton handle
if ($s->can_write($timeout)){ # Gestion du Time out
if ($connected($socketResponse)){ # Si ta socket est bonne ...
print $socketResponse $message; # alors envoyer le message
print "Message Envoyé.n";
}
else{ # Sinon, au Revoir
print "Socket Déconnectée - Byen";
}
}
else {
print "Timeout...n";
}
$s->remove($socketResponse); # retire la gestion du handle à IO::Select
close $socketResponse; # ferme la socket
}
#----------------------------------------------------------------------------


Hope this helps :-)

Sébastien

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

Avatar
lasconic
Je connaissais pas ! donc ça aide ;-) je le mets sous le coude ! mais
dans l'immediat je voulais attendre la reponse... donc je pense que le
can_read fera l'affaire ! ;-)

merci
Lasconic


lasconic wrote:


Bonjour !
Une petite question bete mais qui me turlupine ...
Je veux envoyer un message via un socket et j'aimerai attendre un
acquittement pendant un certain temps seulement. Ouvrir le socket je
vois a peu pres et yecrire aussi mais pour attendre la reponse un
certain temps ? ? ?


sub sendMessage{
my ($ip_address, $message)=@_;
my $socketResponse = IO::Socket::INET->new(PeerAddr => $ip_address,
PeerPort => 2048,
Proto => "tcp",
Type => SOCK_STREAM)
or die "Couldn't connect to $ip_address:2048: $@n";
print $socketResponse $message;
############### C ici qu'il manque un truc ??!!!! ################

close $socketResponse;
}



Salut,
tu peux utiliser IO::Select.
L'avantage c'est qu'il est portable aussi bien sous Linux que sous Windows.

#----------------------------------------------------------------------------
use IO::Select;
my $s=IO::Select->new();
my $timeout;


sub sendMessage{
my ($ip_address, $message)=@_;
my $socketResponse = IO::Socket::INET->new(PeerAddr => $ip_address,
PeerPort => 2048,
Proto => "tcp",
Type => SOCK_STREAM)
or die "Couldn't connect to $ip_address:2048: $@n";
$s->add($socketResponse); # laisse IO::Select gérer ton handle
if ($s->can_write($timeout)){ # Gestion du Time out
if ($connected($socketResponse)){ # Si ta socket est bonne ...
print $socketResponse $message; # alors envoyer le message
print "Message Envoyé.n";
}
else{ # Sinon, au Revoir
print "Socket Déconnectée - Byen";
}
}
else {
print "Timeout...n";
}
$s->remove($socketResponse); # retire la gestion du handle à IO::Select
close $socketResponse; # ferme la socket
}
#----------------------------------------------------------------------------


Hope this helps :-)

Sébastien