Bonjour,

J'aimerais faire du client-serveur intéractif en Perl.

J'ai un serveur.pl qui fonctionne correctement, j'ai repris ce script : http://perl.enstimac.fr/DocFr/perlip...c%20io::socket

Et j'ai un client.pl dont voici le code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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;
Mon problème :
La connexion réussie, et le client reçoit et affiche 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.

Après un déboggage "approfondi" , 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.
En effet, si je ne fais que écrire ou que écouter, cà fonctionne très bien.

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 : http://perl.enstimac.fr/DocFr/perlip...c%20io::socket

Je suis sous Windows 2000 et j'utilise Perl 5.8.8
Est-ce à cause de Windows qui gère mal le fork() ou les sockets ?

Merci d'avance pour votre aide !!