Hola, me gustaría hacer una comunicación cliente-servidor para que desde el cliente se pasen comandos al servidor (fecha, usuarios, salir). En concreto:
1. Los comandos permitidos son:
fecha: Muestra la fecha y hora actual del servidor
usuarios: Muestra los usuarios activos del sistema (asumiremos
2. que el servidor se ejecuta en un sistema compatible con UNIX y
que posee el comando
who).
* La comunicación se llevará a cabo de la siguiente manera (cada envío,
del servidor o del cliente, finalizará con un salto de línea):
+ Al recibir la conexión del cliente, el servidor enviará el mensaje
"Bienvenido.".
+ El cliente enviará el comando deseado ("fecha" o "usuarios").
+ En caso de tratarse de un comando válido, el servidor responderá
con "OK" seguido del resultado de la ejecución del mismo (el cual
puede constar de varias líneas) y luego el mensaje "FIN".
+ En caso de recibir un comando erróneo, el servidor responderá
con el mensaje "ERR".
+ En cualquier caso, el servidor volverá a esperar otro comando.
+ Si el cliente envía el comando "salir" el servidor responderá con
el mensaje de despedida "Adiós." y cerrará la conexión.
La conexión puede ser cerrada por el cliente en cualquier momento, sin que esto afecte el estado del servidor.
De momento he programado esto pero me he hecho un lío con tantas modificaciones que he hecho y por ello ¡¡solicito ayuda!!
SERVIDOR
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use IO::Socket;
$|++;
require "mis_funciones.pl";
system("cls");
system ("title SERVIDOR 5.1");
$puerto = 2222;
$protocolo='tcp';
$servidor = IO::Socket::INET->new(Proto =>$protocolo,
LocalPort=>$puerto,
Listen =>SOMAXCONN,
Reuse =>1)
or die "Error al iniciar el servidor";
system ("color a");
print "\n";
print scalar(localtime); print "\n\n";
print "[Servidor INICIADO] --> ";
print "Puerto de comunicaciones: $puerto \n\n";
print "->Esperando conexiones...\n\n";
while ($conexion = $servidor->accept())
{
$ip = $conexion->peerhost;
print "[Conexion establecida desde $ip]\n";
print $conexion "SERVIDOR: Bienvenido.\n"; #mensaje de bienvenida que envío al cliente
do
{
if ($comando = <$conexion>) #si el cliente ha introducido un comando
{
$comando =~ s/\r\n|\n//g; #elimino el fin de línea al final de la cadena leída
ejecutar($comando, $conexion);
}
else
{
$comando = 'salir';
}
}
until ($comando eq 'salir');
$conexion->shutdown(2);
print "[Conexion finalizada desde $ip]\n\n";
}
Coloreado en 0.007 segundos, usando
GeSHi 1.0.8.4
MIS_FUNCIONES
Using perl Syntax Highlighting
sub ejecutar($$)
{
#capturamos las variables llamadas
$comando =shift;
$conexion =shift;
#inicializamos la variable resultado
$resultado = '';
if ($comando eq 'fecha')
{ $resultado = localtime() . "\n";}
elsif ($comando eq 'usuarios')
{ $resultado = 'who' . "\n";}
elsif ($comando eq 'salir')
{ $resultado= "Gracias por usar este servicio. Adiós.\n";}
else
{
print $conexion "ERR\n";
}
if ($resultado)
{
print "Valor de resultado= $resultado \n";
print $conexion "OK\n";
print $conexion $resultado;
print $conexion "FIN\n";
}
}
1;
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
CLIENTE
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use IO::Socket;
$servidor='localhost';
$puerto=2222;
system("cls");
system("title CLIENTE 5.1");
$conexion = new IO::Socket::INET(PeerAddr => $servidor,
PeerPort => $puerto,
Proto => 'tcp')
or die "Error al conectar con el SERVIDOR $servidor \n";
#mensaje que captura el cliente enviado por el servidor
$mensaje = <$conexion>;
print "$mensaje";
print "\n";
print "Introduce el comando: ";
$comando=<STDIN>;
$estado = <$conexion>;
print "$estado \n";
if ($estado eq "OK\n") {
$salida = <$conexion>;
while ($salida ne "FIN\n") {
print $salida;
$salida = <$conexion>;
}
} elsif ($estado eq "ERR\n") {
print "Comando no valido\n";
} else {
print "Error en el servidor\n";
}
print $conexion "salir\n";
$mensaje = <$conexion>;
$conexion->shutdown(2);
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4