Forum Programmation.perl PHP client -> Perl serveur (communication socket)

Posté par (page perso) .
Tags :
1
24
mai
2012

Bonjour

J'aimerais faire appel à un script PERL qui écoute sur un port via un script PHP. Je ne suis pas loin du résultat (test pour le moment)
Le problème est que ma page php (pour le moment lancé en CLI) bloque au socket_read() . A savoir que sur le serveur quand je remplace par "toto" ça roule de bout en bout mais dès que j'essaye de lire ça bloque…

Une idée lumineuse? Une piste?

Note : j'ai fait un client Perl pour tester le serveur Perl et ça communique bien…

Le client (PHP) :

<?php
/* Get the port for the WWW service. */
$service_port = 6969;

/* Get the IP address for the target host. */
$address = '127.0.0.1';

/* Create a TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
} else {
    echo "OK.\n";
}

echo "Attempting to connect to '$address' on port '$service_port'...";
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
    echo "OK.\n";
}

$in = "test";
$out = '';
socket_write($socket, $in, strlen($in));

#while ($out = socket_read($socket, 2048)) {
#    echo $out;
#}
$out = socket_read($socket, 3000);
echo $out;

socket_close($socket);
echo "Fin";
?>

Le serveur (Perl) :

#!/usr/bin/perl

use warnings;
use IO::Socket;
use Net::hostent;

# Variable 
my $PORT = 6969;
my $RESTRICTION_HOST="localhost"; 

sub logmsg { print "[", scalar localtime, "] - [$$] : @_ \n" }

sub start {

    my $serveur = IO::Socket::INET->new(LocalPort => $PORT,
                                        Type      => SOCK_STREAM,
                                        Reuse     => 1,
                                        Listen    => 10)
    or die "Impossible serveur tcp sur le port $PORT : $@\n";

    logmsg "$0 démarré sur le port $PORT";

    while (my $client = $serveur->accept()) {
        $hostinfo = gethostbyaddr($client->peeraddr);
        # Sécurité
        if ($hostinfo->name ne $RESTRICTION_HOST)
        {
            print $client "Accès refusé, Contactez votre administrateur réseau.\n";
            logmsg "[HACK] Tentative de connexion via ", $hostinfo->name;
            close $client;
        }
        else
        {
            if (my $pid = fork)
            {
                close($serveur);
                logmsg "Debut de connexion via ", $hostinfo->name;

                # Avec ça le client bloque...
                my $arg = <$client>;
                # Avec ça le client tourne
                #my $arg = "toto";
                logmsg "argument client : $arg";
                my $retour = `id`;
                # Envoi du retour sur le client
                print $client $retour;

                close($client);
                logmsg "Fin de connexion via " , $hostinfo->name;  
            }
        }
    }
    $SIG{CHLD} = 'IGNORE';
}

start();

__END__

  • # Manque ton retour chariot !

    Posté par (page perso) . Évalué à 2.

    Tu oublie de faire une retour à la charriot pour "vider" le buffer de ce qui tu écrit sur la socket…

    $in = "test\n";
    $out = '';
    socket_write($socket, $in, strlen($in));

    Ca marche au poil chez moi ! ;-)

    Fuse : j'en Use et Abuse !

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.