Lecture/écriture simultanées sur une socket

Bonjour,

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

J’ai un serveur.pl qui fonctionne correctement, j’ai repris ce script : lien

Et j’ai un client.pl dont voici le 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;

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” :p, 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 : lien

Config : Windows 2000 , Perl 5.8.8
Est-ce à cause de Windows qui gère mal le fork() ou les sockets ?

Merci d’avance pour votre aide !!

Je relance la question,
Je n’ai toujours pas trouver de solution… :frowning:

J’ai dû faire ça aussi mais en .NET, regarde du côté de la gestion asynchrone des sockets en perl, c’est la seule solution.
Il y a aussi la possibilité de changer le status de l’IO ( fcntl($sock, F_SETFL, fcntl($sock, F_GETFL, 0) | O_NONBLOCK) || return 0; )

salut Karl, merci pour ta réponse.

J’ai essayé de changer le statut de l’IO comme tu l’indiques mais j’ai cette erreur :
Your vendor has not defined Fcntl macro F_SETFL, used at C:\perl\projet\03_client.pl line 14.

D’après ce que j’ai trouvé sur le net, la macro F_SETFL n’est pas supportée sur Windows.
Je commence à désespérer… :expressionless:

Sous windows c’est ioctl :slight_smile: