Skip to content

Programando Aplicativos de Rede

shonorio edited this page Feb 20, 2013 · 5 revisions

Programando Aplicativos de Rede

Consumimos serviços de rede diariamente e o objetivo deste artigo é explicar como criar um aplicativo de rede utilizando o Perl.

Início de tudo

Atualmente computadores ligado em rede é tão natural que nos escapa a quantidade de padronização necessária para permitir que um celular acesse uma informação que está num Mainframe. No início da computação era comum a completa incompatibilidade entre equipamento de diferentes fornecedores, e para resolver este problema foi criado o Modelo OSI que distribui todo o fluxo de comunicação em 7 camadas de maneira que cada uma deve possuir um protocolo de comunicação entre os interlocutores no mesmo nível e com a camada imediatamente superior, permitindo que componentes de fornecedores diferentes possam conviver harmoniosamente.

Com a popularização da Internet o protocolo de rede IP tornou-se padrão, determinando as terminologias e a API utilizadas hoje para o desenvolvimento de aplicativos em rede.

O desenvolvimento da Internet ocorreu utilizando o Unix como sistema operacional padrão, e na década de 1980 a versão aberta e de licenciamento livre chamada Berkeley Software Distribution (atualmente conhecida como BSD Unix) foi largamente utilizada pelos vendedores nas estações de trabalho fornecidas as universidades em oposição aos sistemas Unix proprietário da AT&T, DEC e Sun. O licenciamento livre do sistema operacional e da biblioteca de protocolo de rede fez com que a API Berkeley sockets fosse amplamente difundida e utilizada pelos pesquisadores, tornando-se um padrão de fato.

Operação de Entrada e Saida (Input/Output)

Na computação, o termo E/S (ou I/O em inglês) refere-se a entrada de dados por alguma interface (teclado, disco e rede, por exemplo) e a saída do resultado em outra interface (video, disco e rede, por exemplo).

#!/usr/bin/env perl
use strict;

print qq/Digite alguma coisa :\n/;
my $entrada = <STDIN>;
chomp $entrada;
print qq/Foi digitado : "$entrada"\n/;

O simples código acima é um exemplo de um aplicativo utilizando o E/S. Na execução do código será impresso uma mensagem na saída padrão do usuário, logo em seguida o aplicativo ficará bloqueado aguardando a entrada de dados do usuário via a interface padrão do usuário (aqui representado por <STDIN>). O aplicativo ficará aguardando até receber o caractere de linha de retorno (também conhecido como ENTER).

Observe que estou utilizando os termos 'entrada padrão' e 'saída padrão', mas você poderia pensar que isto é uma preciosidade, que seria muito mais simples e objetivo dizer apenas 'imprimir na tela', 'ler o teclado'. Mas não é verdade, existe uma quantidade enorme de interfaces de E/S. Num sistema operacional Unix, por exemplo, eu poderia executar o programa da seguinte forma :

echo "Sou feliz por programar em Perl" | /tmp/programa_exemplo_1.pl > /tmp/saida.txt

Onde você está utilizando de recursos de shell do sistema operacional para definir outras interfaces de entrada (neste caso a saída do comando echo) e interfaces de saída (neste caso um arquivo que será armazenado no disco) ao invés do teclado e monitor.

As interfaces também apresentam outra característica muito importante, elas podem ser blocking i/o (E/S Bloqueante) e non-blocking i/o (E/S Não-bloqueante).

Bloquear vs Não bloquear

Na interface bloqueante (blocking) o processo fica suspenso até a finalização da operação de E/S. É muito fácil de utilizar e simples de entender o código, mas insuficiente para algumas necessidades de serviços.

A Não-bloqueante disponibiliza os dados ao processo a medida que eles aparecem, exigindo um grande esforço no fluxo de controle, reconstrução e validação dos dados por parte do programador.

Basicão ( Berkeley Sockets )

(como sockets e portas)

. apresentar as apis nativas do perl no modo BSD Sockets
. apresentar uma aplicação bem simples que ouça uma porta tcp e retorno um 'ola mundo' com a identificação do cliente

A família IO::Socket são nossos amigos

. apresentar os IO::Socket::*
. reescrever a aplicação o item anterior com o IO::Socket::*

O trabalho sujo é o Framework quem faz

. apresentar um framework, ainda estou na dúvida de qual, talvez o POE

Desenvolvendo um Aplicativo de rede

. a estrutura abaixo é chupada do livro 'Network Programming with Perl', ainda vou pensar em como executar esta parte.

Forking Server

Multiplexed

Nonblocking I/O

Preforking

Bulletproofing

Segurança

Devido a característica de permitir a execução de processos remotamente, o aplicativo de rede faz com que o item B<segurança> tenha destaque durante o desenvolvimento. O gerenciamento de memória dinâmica do Perl aumenta a segurança dos aplicativo de rede ao evitar os famosos L<buffer overflow|http://en.wikipedia.org/wiki/Buffer_overflow>, um drama existente nas L<linguagens compiladas|http://en.wikipedia.org/wiki/Compiled_language>.

Outra importante característica nativa de segurança do Perl é o modo B que evita a execução de operações de execução de comandos do sistema e a abertura de aquivos com os dados originado da rede.

Mesmo estas características de segurança do Perl não libera o programador da primeira regra do desenvolvimento seguro : B, sempre é necessário verificar a origem e qualidade antes do consumo pelo aplicativo.

=head2 Referências

L<Berkeley Sockets|http://en.wikipedia.org/wiki/Berkeley_socket>