Fíjate que estuve revisando el hilo que me sugieres, por ahí hay a su vez otro hilo del "Linux Journal" con unos ejemplos interesantes, en particular llamaron mi atención dos: el 5 (server2way.pl) y el 7 (clientfork.pl)... a partir de los cuales me parece que puedo hacer lo que busco, en principio me he trazado como metas reproducir este sencillo ejemplo, hacer los ajustes del caso para que funcione de acuerdo con mis necesidades y luego hacer una GUI... pero claro, primero caminemos y luego volamos... así que primero reproducir el ejemplo...
Les he probado, pero no he conseguido que funcionen a pesar que he agregado un chomp() luego del <STDIN>; esta es la parte responsable de pasar la palabra que el cliente escribe al servidor y el servidor responde de acuerdo a un código establecido, si el cliente dice en la STDIN "HELLO", el servidor dice "HI", si dice "NAME" pues responderá en mi caso "LOCALHOST" y así... el asunto es que parece que no está pasándose la palabra bien al lado del servidor, al menos he visto que no entra al bucle
Using perl Syntax Highlighting
¿Qué crees que pase?
¡Muchas Gracias!
Como referencia aquí está el código del servidor (server2way.pl) tomado del "Linux Journal".
Using perl Syntax Highlighting
#!/usr/bin/perl -w
# server2way.pl - a server that reads from
# and writes to a client
use strict;
use IO::Socket;
use Sys::Hostname;
my $sock = new IO::Socket::INET(
LocalHost => 'localhost',
LocalPort => 7890,
Proto => 'tcp',
Listen => SOMAXCONN,
Reuse => 1);
$sock or die "no socket :$!";
STDOUT->autoflush(1);
my($new_sock, $buf);
while ($new_sock = $sock->accept()) {
# got a client connection, so read
# line by line until end-of-file
while (defined($buf = <$new_sock>)) {
# respond to client request using
# a cleverly disguised switch
# statement
foreach ($buf) {
/^HELLO$/ and
print($new_sock "Hi\n"),
last;
/^NAME$/ and
print($new_sock hostname(),
"\n"),
last;
/^DATE$/ and
print($new_sock
scalar(localtime),
"\n"),
last;
# default case:
print $new_sock "DEFAULT\n";
}
}
close $new_sock;
}
# server2way.pl - a server that reads from
# and writes to a client
use strict;
use IO::Socket;
use Sys::Hostname;
my $sock = new IO::Socket::INET(
LocalHost => 'localhost',
LocalPort => 7890,
Proto => 'tcp',
Listen => SOMAXCONN,
Reuse => 1);
$sock or die "no socket :$!";
STDOUT->autoflush(1);
my($new_sock, $buf);
while ($new_sock = $sock->accept()) {
# got a client connection, so read
# line by line until end-of-file
while (defined($buf = <$new_sock>)) {
# respond to client request using
# a cleverly disguised switch
# statement
foreach ($buf) {
/^HELLO$/ and
print($new_sock "Hi\n"),
last;
/^NAME$/ and
print($new_sock hostname(),
"\n"),
last;
/^DATE$/ and
print($new_sock
scalar(localtime),
"\n"),
last;
# default case:
print $new_sock "DEFAULT\n";
}
}
close $new_sock;
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Y del Cliente (clientfork.pl)
Using perl Syntax Highlighting
#!/usr/bin/perl -w
# clientfork.pl - a client that forks to
# read from STDIN and write to a server
use strict;
use IO::Socket;
my $host = shift || 'localhost';
my $port = shift || 7890;
my $sock = new IO::Socket::INET(
PeerAddr => $host,
PeerPort => $port,
Proto => 'tcp');
$sock or die "no socket :$!";
$sock->autoflush(1);
my($in, $buf, $kid);
die "fork fail: $!" unless defined($kid = fork);
if ($kid) {
# parent reads from STDIN, prints to socket
while (defined($in = <STDIN>)) {
# Aqui he agregado el chomp...
chomp $in;
print $sock $in;
}
# kill the child process
kill(TERM => $kid);
} else {
# child reads from socket, prints to STDOUT
while (defined($buf = <$sock>)) {
print $buf;
}
close $sock;
}
# clientfork.pl - a client that forks to
# read from STDIN and write to a server
use strict;
use IO::Socket;
my $host = shift || 'localhost';
my $port = shift || 7890;
my $sock = new IO::Socket::INET(
PeerAddr => $host,
PeerPort => $port,
Proto => 'tcp');
$sock or die "no socket :$!";
$sock->autoflush(1);
my($in, $buf, $kid);
die "fork fail: $!" unless defined($kid = fork);
if ($kid) {
# parent reads from STDIN, prints to socket
while (defined($in = <STDIN>)) {
# Aqui he agregado el chomp...
chomp $in;
print $sock $in;
}
# kill the child process
kill(TERM => $kid);
} else {
# child reads from socket, prints to STDOUT
while (defined($buf = <$sock>)) {
print $buf;
}
close $sock;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4