Conceitos básicos sobre Sockets

Pedro Henrique
Publicado em 19/08/2006

r2 - 19 Aug 2006 - JoenioCosta

Conceitos básicos sobre Sockets

Não estou aqui tentando ensinar ningúem a programar, mas somente tentando auxiliar a todos que tiverem curiosidade a aprenderem um pouco mais.

O Perl é uma linguagem de programação muito poderosa e flexivel, e fornece ao usuário uma ótima interface com o ambiente que iremos estudar, ou seja as sockets.

1. Introdução

Nesse artigo irei explicar os primeiros passos a serem dados para alguém entender sockets, após a leitura do mesmo, você estara apto a desenvolver clientes, desempenhar pequenas tarefas, e com um pouco de imaginação poderá fazer o que bem entender.

IMPORTANTE: É necessário um conhecimento básico em Perl e TCP/IP.

1.1. Afinal o que são sockets?

Seria impossível explicar detalhadamente o que são sockets nesse humilde artigo, mas basicamente elas são uma forma desenvolvida para programas se comunicarem.

Caso você tenha mais curiosidade sobre o assunto, seria aconselhavel uma leitura sobre TCP/IP. Básicamente sem a existencia das sockets, não existiria comunicacão entre computadores ligados em rede, é como você viver em uma sociedade sem fala ou linguagem.

1.2. Quais as vantagens de se ter um conhecimento sobre isso?

As vantagens vão até aonde sua mente consegue chegar, ou seja, não existem limites definidos. Ao invés de eu tentar dizer qual a vantagem de aprender a utilizar sockets, deixarei você mesmo chegar a essa conclusão até o final do artigo.

2. O módulo IO::Socket

Esse módulo foi desenvolvido para que implementações de sockets sejam mais simples sem perderem poder, ou seja, você vai para a mesma cidade utilizando a estrada mais curta.

2.1. Carregando o módulo

   1 use IO::Socket;
   2 my $socket = IO::Socket::INET->new();

Na linha 1 estamos chamando o módulo, e na linha 2 estamos carregando a socket.

3. Criando seu primeiro cliente

Agora vamos parar de enrolar, e por um pouco a mão na massa...

3.1. Definindo o servidor

   1 use IO::Socket;
   2 my $socket = IO::Socket::INET->new(
   3                                    PeerAddr => "www.servidor.com.br"
   4                                   );

Como você pode ver, na linha 3 estamos definindo o servidor ou seja, PeerAddr = IP/Host do servidor.

3.2. Definindo a porta

   1 use IO::Socket;
   2 my $socket = IO::Socket::INET->new(
   3                                    PeerAddr => "www.servidor.com.br",
   4                                    PeerPort => "80"
   5                                   );

Na linha 4 estamos definindo a porta do servidor (podemos também indicar o serviço), no caso conectaremos na porta 80 (HTTP).

3.3. Definindo o protocolo de comunicação

   1 use IO::Socket;
   2 my $socket = IO::Socket::INET->new(
   3                                    PeerAddr => "www.servidor.com.br",
   4                                    PeerPort => "80",
   5                                    Proto => "tcp"
   6                                   );

Na linha 5 estamos definindo o protocolo, utilizaremos o TCP.

3.4. Fechando a socket em caso de erro

   1 use IO::Socket;
   2 my $socket = IO::Socket::INET->new(
   3                                    PeerAddr => "www.servidor.com.br",
   4                                    PeerPort => "80",
   5                                    Proto => "tcp"
   6                                   );
   7 die "Não foi possível criar a socket\n" unless $socket;

Caso não for possível criar a socket será exibida uma mensagem de erro definida na linha 7, e consequentemente essa operação sera abandonada.

3.5. Enviando alguma mensagem ao servidor

   1 use IO::Socket;
   2 my $socket = IO::Socket::INET->new(
   3                                    PeerAddr => "www.servidor.com.br",
   4                                    PeerPort => "80",
   5                                    Proto => "tcp"
   6                                   );
   7 die "Não foi possível criar a socket\n" unless $socket;
   8 if ($socket) {
   9 print $socket "GET /index.html HTTP/1.0\r\n\r\n";
  10 }

Como você pode ver, criamos a socket, verificamos se estamos conectados e após isso enviamos a mensagem 'GET /index.html' para o servidor requisitando o arquivo index.html.

Claro isso é só um exemplo você poderia enviar simplesmente um:

   print $socket "oi \n";

3.6. Imprimindo as respostas do servidor na tela

   1 use IO::Socket;
   2 my $socket = IO::Socket::INET->new(
   3                                    PeerAddr => "www.servidor.com.br",
   4                                    PeerPort => "80",
   5                                    Proto => "tcp"
   6                                   );
   7 die "Não foi possível criar a socket\n" unless $socket;
   8 if ($socket) {
   9 print $socket "GET /index.html HTTP/1.0\r\n\r\n";
  10 while (<$socket>) {
  11 print "$_";
  12 }}

Agora utilizaremos um while dentro do if, ou seja caso a socket esteja presente, o cliente requisitara o arquivo index.html, e até o servidor encerrar a conexão, o cliente estara aguardando e imprimindo (graças a variavel especial $_) todas as respostas do servidor.

3.7. Fechando a socket

   1 use IO::Socket;
   2 my $socket = IO::Socket::INET->new(
   3                                    PeerAddr => "www.servidor.com.br",
   4                                    PeerPort => "80",
   5                                    Proto => "tcp"
   6                                   );
   7 die "Não foi possível criar a socket\n" unless $socket;
   8 if ($socket) {
   9 print $socket "GET /index.html HTTP/1.0\r\n\r\n";
  10 while (<$socket>) {
  11 print "$_";
  12 }}
  13 close($socket);

Finalmente, após a pequena operação, a socket será fechada.

4. Resultado final

   1 #!/usr/bin/perl
   2 use IO::Socket;
   3 my $socket = IO::Socket::INET->new(
   4                                    PeerAddr => "www.servidor.com.br",
   5                                    PeerPort => "80",
   6                                    Proto => "tcp"
   7                                   );
   8 die "Não foi possível criar a socket\n" unless $socket;
   9 if ($socket) {
  10 print $socket "GET /index.html HTTP/1.0\r\n\r\n";
  11 while (<$socket>) {
  12 print "$_";
  13 }}
  14 close($socket);
  15 exit;

5. Bibliografia

* Online

* Título: IO::Socket::INET
* Descrição:
  • * Título: Perl, Sockets and TCP/IP Networking
    * Descrição:
  • * Título: IO::Socket
    * Descrição:

----

AUTHOR

Pedro Henrique

blog comments powered by Disqus