J'aimerais faire du client-serveur avec des sockets en Perl.
J'ai 2 scripts : un serveur.pl et un client.pl.
Le serveur fonctionne correctement mais j'ai un problème avec le client.
voici son code :
use IO::Socket;
use warnings;
use strict;
my ($sock, $kidpid);
$sock = IO::Socket::INET->new(Proto => "tcp",
PeerAddr => "192.168.0.11",
PeerPort => 9000)
|| die "Failed : $!";
$sock->autoflush(1);
$kidpid = fork();
die "can't fork: $!" if ! defined($kidpid);
if ($kidpid) {
# PERE : Ecoute des entrées clavier et envoi à la socket
while (<STDIN>) { print $sock $_; }
} else {
# FILS : Ecoute de la socket et affichage à l'écran
while (<$sock>) { print STDOUT $_; }
}
close $sock;
Le client se connecte au serveur et reçoit bien les messages d'accueil du serveur.
Mais après la première ligne rentrée au clavier, çà se "bloque". Et le serveur ne recoit même pas cette ligne.
En mettant des print à toutes les lignes, j'en ai conclu que le processus père n'arrive pas à écrire sur la socket tant que le fils boucle sur cette même socket pour écouter.
Si je ne fais que écrire ou que écouter, cà fonctionne très bien. Mais les 2 en même temps, çà veut pas.
J'ai essayer plusieurs scripts client trouvés sur le net et j'en arrive toujours au même problème.
Même celui proposé ici réagit pareil : Lien
Je suis sous Windows 2000 et j'utilise Perl 5.8.8
le fork() de Perl sous Windows ne pose pas de problème. Par exemple, si père et fils ne font que des prints, çà marche.
Peut-être y a-t-il d'autres paramètres à utiliser pour les sockets sur windows ?