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