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 ze_lionix (site web personnel) . É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 !
[^] # Re: Manque ton retour chariot !
Posté par ze_lionix (site web personnel) . Évalué à 2.
Bourré de fautes… En plus je suis allé un peu vite en mettant chariot à la place de ligne…
Toutes mes excuses :
Tu oublies de faire un retour charriot pour "vider" le buffer de ce qui tu écris sur la socket…
Fuse : j'en Use et Abuse !
[^] # Re: Manque ton retour chariot !
Posté par David (site web personnel) . Évalué à 0.
Super, je te dis merci, c'était effectivement tout c… mais il fallait le savoir…
Sinon petite question bonus, pour optimiser du code, est-ce que le fork est préférable?
[^] # Re: Manque ton retour chariot !
Posté par ze_lionix (site web personnel) . Évalué à 1.
Je suppose que tu parles de supporter les connexions multiples pour ton serveur.
Ca va dépendre de ce que tu souhaites faire… Ceci devrait t'aider
Fuse : j'en Use et Abuse !
[^] # Re: Manque ton retour chariot !
Posté par David (site web personnel) . Évalué à 0.
Merci bien, c'est super je vais potasser ça…
Mon bébé projet est un sous projet mais je l'ai publié quand même : http://forge.zici.fr/projects/php2perld
Merci encore,
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.