OVH Cloud OVH Cloud

IO::Socket

6 réponses
Avatar
alain
bonjour,

je debute abec les socket et je malgré plein d'exemple je n'arrive pas à
faire ce que je souhaite (a chaque foit les exemple ce limite à "parler" au
serveur)

ce que je cherche à faire :

le client doit transmettre une ligne (string du type : "XXXXX-123456-NDM")
et attendre LES reponses....

le serveur attend une ligne (string du type "XXXXX-123456-NDM")
si c'est ok il effectue des actions et pour chaque action realisé il devra
"repondre" au client avec un string du type "1:ok","2:ok" etc...
quand il aura fini, il transmettra le string "exit" afin que le client sache
que c'est fini et ce deconnecte...

je n'arrive pas à faire ceci, si quelqu'un pouvait m'aider ce serait super
sympa
d'avance merci
A+

6 réponses

Avatar
Scetbon Cyril
Un petit exemple qui fonctionne:

use IO::Socket;
my $tt = 0;
my $serveur=IO::Socket::INET->new(
LocalPort => 5050,
Type => SOCK_STREAM,
Listen => 1,
ReuseAddr => 1)
or die "Impossible de lancer le serveur : $@n";
while (my ($client,$client_add) = $serveur->accept())
{
close($serveur);
print $client "Connection reussi !n";
while(my $ligne = <$client>)
{
print "RECU: $ligne";
print $client "RECU: $ligne";
if($ligne=~/^QUIT/i)
{
#close($client);
undef $client;
$tt++
}
if($ligne=~/^EVEIL/i)
{
$tt++
}
}
if($tt <= 0)
{ print $client "Erreur!n" }
exit
}
continu
{ close($serveur) }

Tu pourras t'inspirer de cet exemple. Par contre, c'est un serveur non
multithreadé. Donc les clients qui se connectent devront attendre leur
tour :-(

Mais cela dépend de ce que tu as besoin.

En espérant que cela t'aide.
alain wrote:
bonjour,

je debute abec les socket et je malgré plein d'exemple je n'arrive pas à
faire ce que je souhaite (a chaque foit les exemple ce limite à "parler" au
serveur)

ce que je cherche à faire :

le client doit transmettre une ligne (string du type : "XXXXX-123456-NDM")
et attendre LES reponses....

le serveur attend une ligne (string du type "XXXXX-123456-NDM")
si c'est ok il effectue des actions et pour chaque action realisé il devra
"repondre" au client avec un string du type "1:ok","2:ok" etc...
quand il aura fini, il transmettra le string "exit" afin que le client sache
que c'est fini et ce deconnecte...

je n'arrive pas à faire ceci, si quelqu'un pouvait m'aider ce serait super
sympa
d'avance merci
A+




Avatar
Scetbon Cyril
Scetbon Cyril wrote:

Tu pourras t'inspirer de cet exemple. Par contre, c'est un serveur non
multithreadé. Donc les clients qui se connectent devront attendre leur
tour :-(
Euh, pire ici y aura qu'un client, enfin c qu'un exemple.


Avatar
alain
meci pour ton exemple, mais comment faire pour que le serveur reste en
ecoute lorsque la connexion avec un client est terminé (actuellement il ce
ferme)
merci
A+

"Scetbon Cyril" a écrit dans le message news:
bpfoei$

Scetbon Cyril wrote:

Tu pourras t'inspirer de cet exemple. Par contre, c'est un serveur non
multithreadé. Donc les clients qui se connectent devront attendre leur
tour :-(
Euh, pire ici y aura qu'un client, enfin c qu'un exemple.





Avatar
alain
re:
j'ai trouvé pour que le serveur reste en listen à la fin d'une connexion,
par contre
il ne veut pas transmettre mes info à la suite
help me please :(

---------------------------------------------
use IO::Socket;

my $serveur=IO::Socket::INET->new(
LocalPort => 5001,
Type => SOCK_STREAM,
Listen => 1,
ReuseAddr => 1)
or die "Impossible de lancer le serveur : $@n";


while (my ($client,$client_add) = $serveur->accept())
{

print $client "Connection reussi !n";

while(my $ligne = <$client>)
{
print "RECU: $ligne";
print $client "RECU: $lignen";
}

print $client "1...n";
sleep(1);
print $client "2...n";
sleep(1);
print $client "3...n";
sleep(1);
print $client "finn";
undef $client;

}

continue
{
#close($serveur)
}


------------------------------------------
"Scetbon Cyril" a écrit dans le message news:
bpfoei$

Scetbon Cyril wrote:

Tu pourras t'inspirer de cet exemple. Par contre, c'est un serveur non
multithreadé. Donc les clients qui se connectent devront attendre leur
tour :-(
Euh, pire ici y aura qu'un client, enfin c qu'un exemple.





Avatar
Scetbon Cyril
On retouche un peu tout ça pour avoir une version un peu plus élaborée:

use IO::Socket;
my $serveur=IO::Socket::INET->new(
LocalPort => 5050,
Type => SOCK_STREAM,
Listen => 1,
ReuseAddr => 1)
or die "Impossible de lancer le serveur : $@n";
while (my ($client,$client_add) = $serveur->accept())
{
print "Nouvelle Connexion clienten";
print $client "Connection reussi !n";
while(my $ligne = <$client>)
{
print "RECU: $ligne";
print $client "RECU: $ligne";
undef $client if($ligne=~/^QUIT/i);
if($ligne=~/HALT/i)
{
print "Demande d'arret du serveurn";
print "Fermeture clientn";
undef $client;
print "Fermeture serveurn";
undef $serveur;
exit
}
}
print "Fin de connexion clienten"
}

Voilà, lorsqu'un client interrompt sa connexion (en envoyant quit) le
serveur attend une nouvelle connexion. Lorsqu'un client envoie halt le
serveur ferme la connexion cliente puis s'interrompt.

alain wrote:
meci pour ton exemple, mais comment faire pour que le serveur reste en
ecoute lorsque la connexion avec un client est terminé (actuellement il ce
ferme)
merci
A+

"Scetbon Cyril" a écrit dans le message news:
bpfoei$

Scetbon Cyril wrote:


Tu pourras t'inspirer de cet exemple. Par contre, c'est un serveur non
multithreadé. Donc les clients qui se connectent devront attendre leur
tour :-(


Euh, pire ici y aura qu'un client, enfin c qu'un exemple.









Avatar
Scetbon Cyril
voir + haut.
Surement un souci de flush. Il faut forcer la non bufferisation et
l'envoi des caractères.

ajoute ça avant de commencer l'envoi de tes chaines.
select((select($client),$|++)[0]);

alain wrote:
re:
j'ai trouvé pour que le serveur reste en listen à la fin d'une connexion,
par contre
il ne veut pas transmettre mes info à la suite
help me please :(

---------------------------------------------
use IO::Socket;

my $serveur=IO::Socket::INET->new(
LocalPort => 5001,
Type => SOCK_STREAM,
Listen => 1,
ReuseAddr => 1)
or die "Impossible de lancer le serveur : $@n";


while (my ($client,$client_add) = $serveur->accept())
{

print $client "Connection reussi !n";

while(my $ligne = <$client>)
{
print "RECU: $ligne";
print $client "RECU: $lignen";
}

print $client "1...n";
sleep(1);
print $client "2...n";
sleep(1);
print $client "3...n";
sleep(1);
print $client "finn";
undef $client;

}

continue
{
#close($serveur)
}


------------------------------------------
"Scetbon Cyril" a écrit dans le message news:
bpfoei$

Scetbon Cyril wrote:


Tu pourras t'inspirer de cet exemple. Par contre, c'est un serveur non
multithreadé. Donc les clients qui se connectent devront attendre leur
tour :-(


Euh, pire ici y aura qu'un client, enfin c qu'un exemple.