Salve Monges!<div><br></div><div><br></div><div>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:</div>
<div><br></div><div>- O 'socket' do lado do 'client' escreve coisas no socket </div><div>- O 'socket' do lado do server lê coisas do Socket;</div><div><br></div><div>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:</div>
<div><br></div><div><br></div><div>SERVER: </div><div><br></div><div><code></div><div>use strict;</div><div>use warnings;</div><div>use IO::Socket::INET</div><div>use Daemon::Generic;</div><div>use feature qw/ say switch /;</div>
<div>.</div><div>.</div><div>.</div><div>#configuração</div><div>.</div><div>.</div><div>.</div><div><div> my $usock = IO::Socket::INET->new ( </div><div> Type<span class="Apple-tab-span" style="white-space:pre"> </span>=> SOCK_STREAM ,</div>
<div> LocalAddr<span class="Apple-tab-span" style="white-space:pre"> </span>=> $config_socket->{ SocketBind },</div><div> LocalPort<span class="Apple-tab-span" style="white-space:pre"> </span>=> $config_socket->{ SocketPort },</div>
<div> Proto<span class="Apple-tab-span" style="white-space:pre"> </span>=> 'tcp',</div><div> Listen<span class="Apple-tab-span" style="white-space:pre"> </span>=> 1,</div>
<div> ReuseAddr<span class="Apple-tab-span" style="white-space:pre"> </span>=> 1,</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> ) or die $!;</div></div>
<div><br></div><div><br></div><div> my $pid = fork;</div><div> if(!defined($pid)){</div><div> say "FATAL! Sem recursos para o fork! Abortando!";</div><div> exit 0;</div><div> }</div><div> elsif($pid == 0){</div>
<div> my $newconn = &get_conn(); </div><div> while(1){</div><div> #uma 'pá' de coisa aqui no child...</div><div> sleep 60;</div><div> }</div><div> exit(1);</div>
<div> }</div><div> else {</div><div> my $r = undef;</div><div> while(1){</div><div> say "I'm working!";</div><div> if( $r = $usock->accept ){</div><div> &process_commands($r, \$usock);</div>
<div> }</div><div> else {</div><div> $logerr->write('error','Problemas com o socket! Abortando!' . $!);</div><div> exit(0);</div><div> }</div>
<div> sleep 1;</div><div> }</div><div># $usock->close;</div><div> close $out;</div><div><br></div><div> waitpid($pid,0);</div><div> }</div><div><br></div><div><br></div><div><br>
</div><div><div>sub process_commands {</div><div> my $sh = shift;</div><div> my $rsock = shift;</div><div> my $res = 0;</div><div> while(<$sh>){</div><div> #tratando o que vem do client</div><div>
my $out = $_ || 'none';</div><div> $out =~ s/^(\ |\t)+//;</div><div> my @params = split /\ +/, $out;</div><div> my ($command,$parameter) = ( $params[0],$params[1] );</div><div> #separando algumas informações</div>
<div> my %client_auth_data = ( host => undef,</div><div> user => undef,</div><div> password => undef,</div><div> port => undef,</div>
<div> );</div><div><br></div><div> #Implementar a camada de autenticação aqui.</div><div><br></div><div> given($command){</div><div> when( 'stopsafe' ){</div><div> say 'Executando o stopsafe';</div>
<div> if(!&pause_MTAs()){</div><div> #enviar mensagem de erro via socket </div><div> }</div><div> else {</div><div> #enviar mensagem de ok para o socket...</div>
<div> } </div><div><br></div><div> $res = 1;</div><div> }</div><div> #mais uma pancada de comandos aqui...</div><div> default {</div><div> my $msg = "Comando inválido! '$command $parameter' ";</div>
<div> }</div><div> }</div><div> }</div><div> return $res;</div><div>}</div></div><div><br></div><div><br></div><div><br></div><div></code></div><div><br></div><div><br></div><div>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.</div>
<div><br></div><div><br></div><div><br></div><div>CLIENT</div><div><br></div><div><code></div><div> use strict;</div><div> use warnings;</div><div> use IO::Socket::INET;</div><div> .</div><div> .</div>
<div> .</div><div><br></div><div><div> my ($bind, $port ) = @_;</div><div> my $sock = IO::Socket::INET->new ( </div><div> PeerAddr<span class="Apple-tab-span" style="white-space:pre"> </span>=> $bind,</div>
<div> PeerPort<span class="Apple-tab-span" style="white-space:pre"> </span>=> $port,</div><div> Proto<span class="Apple-tab-span" style="white-space:pre"> </span>=> 'tcp',</div>
<div> Blocking => 0,</div><div> ReuseAddr => 1,</div><div> ) or die $!;</div><div> </div><div> $sock->send('chave1 valor1 chave2 valor2');</div>
<div><br></div><div> while(<$sock>){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>#Teoricamente deveria ter alguma coisa no socket, mas nao rola...</div><div> }</div><div><br></div><div>
$sock->close();</div></div><div><br></div><div><br></div><div></code></div><div><br></div><div><br></div><div>Perguntas:</div><div><br></div><div><br></div><div>- Como gravar no socket do lado do server, de modo que isso seja legível do lado do client?</div>
<div>- Preciso de protocolo específico para fazer isso ?</div><div>- 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?</div>
<div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div>Cheers!</div><div><br></div><div><br></div><div><br clear="all"><br>-- <br>André Garcia Carneiro<br>Analista/Desenvolvedor Perl<br>
(11)82907780<br>
</div>