Salve Monges!

Estou com uns problemas com Sockets que mesmo fuçando bastante eu não
consegui resolver. Os sockets tanto do lado do servidor quanto do lado do
cliente estão ok, e isso significa:

- O 'socket' do lado do 'client' escreve coisas no socket
- O 'socket' do lado do server lê coisas do Socket;

Agora eu preciso que o socket do lado do servidor envie os resultados como
mensagens de erros e dados, de maneira geral, para o client. O que tá
rolando agora:


SERVER:

<code>
use strict;
use warnings;
use IO::Socket::INET
use Daemon::Generic;
use feature qw/ say switch /;
.
.
.
#configuração
.
.
.
    my $usock = IO::Socket::INET->new (
                            Type => SOCK_STREAM ,
                            LocalAddr => $config_socket->{ SocketBind },
                            LocalPort => $config_socket->{ SocketPort },
                            Proto => 'tcp',
                            Listen => 1,
                            ReuseAddr => 1,
                ) or die $!;


  my $pid = fork;
      if(!defined($pid)){
        say "FATAL! Sem recursos para o fork! Abortando!";
        exit 0;
    }
    elsif($pid == 0){
        my $newconn = &get_conn();
        while(1){
            #uma 'pá' de coisa aqui no child...
            sleep 60;
        }
        exit(1);
    }
    else {
        my $r = undef;
        while(1){
            say "I'm working!";
            if( $r = $usock->accept ){
                &process_commands($r, \$usock);
            }
            else {
                $logerr->write('error','Problemas com o socket! Abortando!'
. $!);
                exit(0);
            }
            sleep 1;
        }
#        $usock->close;
        close $out;

        waitpid($pid,0);
    }



sub process_commands {
    my $sh = shift;
    my $rsock = shift;
    my $res = 0;
    while(<$sh>){
        #tratando o que vem do client
        my $out = $_ || 'none';
        $out =~ s/^(\ |\t)+//;
        my @params = split /\ +/, $out;
        my ($command,$parameter) = ( $params[0],$params[1] );
        #separando algumas informações
        my %client_auth_data = (    host     => undef,
                                    user     => undef,
                                    password => undef,
                                    port     => undef,
                        );

        #Implementar a camada de autenticação aqui.

        given($command){
            when( 'stopsafe' ){
                say 'Executando o stopsafe';
                if(!&pause_MTAs()){
                         #enviar mensagem de erro via socket
                }
                else {
                         #enviar mensagem de ok para o socket...
                }

                $res = 1;
            }
            #mais uma pancada de comandos aqui...
            default {
                my $msg = "Comando inválido! '$command $parameter' ";
            }
        }
    }
    return $res;
}



</code>


Resumo: Eu tenho um processo que fica executando várias outras coisas, e um
outro só para ficar escutando comando vindo do socket do lado do CLIENT! O
que eu quero fazer, imagino eu, seria gravar alguma coisa no socket de
dentro dessa função 'process_commands'. E de alguma forma ler isso do
client.



CLIENT

<code>
    use strict;
    use warnings;
    use IO::Socket::INET;
    .
    .
    .

    my ($bind, $port ) = @_;
    my $sock = IO::Socket::INET->new (
                                PeerAddr => $bind,
                                PeerPort => $port,
                                Proto => 'tcp',
                                Blocking    => 0,
                                ReuseAddr   => 1,
                        ) or die $!;

    $sock->send('chave1 valor1 chave2 valor2');

    while(<$sock>){
#Teoricamente deveria ter alguma coisa no socket, mas nao rola...
    }

    $sock->close();


</code>


Perguntas:


- Como gravar no socket do lado do server, de modo que isso seja legível do
lado do client?
- Preciso de protocolo específico para fazer isso ?
- Eu vi algumas pessoas usando udp ao invés de tcp alegando aumento de
performance, mas abrindo mão de vários quesitos de segurança dentre outros
problemas. Confirma?







Cheers!




-- 
André Garcia Carneiro
Analista/Desenvolvedor Perl
(11)82907780
=begin disclaimer
   Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
 SaoPaulo-pm mailing list: SaoPaulo-pm@pm.org
 L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer

Responder a