Manipulação de sockets em Perl usando o IO::Socket::INET
Resolvi escrever esse artigo sobre manipulação de sockets em Perl usando o IO::Socket::INET para ajudar os novatos, já que a maioria dos artigos existentes são em inglês, dificultando a leitura de muitos.
Criação do IO::Socket::INET
Manipulação de sockets em Perl é o assunto do meu primeiro artigo, primeiro de muitos que ainda irei escrever. Resolvi escrever sobre esse tema pois encontrei muito poucos artigos em português falando a respeito.
A manipulação de sockets em Perl é simples, muito mais simples com o uso do IO::Socket::INET. E é sobre como usar o IO::Socket::INET que irei falar, é claro que existem outras maneiras de implementar o uso de sockets no Perl, mas não abordarei essas maneiras.
O IO::Socket::INET é criado com o método new. O método new pode receber como argumentos a seguintes opções:
PeerAddr => hostname[:porta]
Serve para especificar o host remoto e opcionalmente a porta. O hostname pode ser tanto um nome como www.vivaolinux.com.br como um número de IP na seguinte forma xxx.xxx.xxx.xxx.
PeerPort => porta
Serve para especificar o número da porta em um host remoto. Caso você não saiba o número do serviço, um nome de serviço como http, ftp poderá ser usado.
LocalAddr => hostname[:porta]
Serve para especificar um endereço local e opcionalmente a porta.
LocalPort => porta
Serve para especificar o número da porta ou o nome do serviço.
Proto => nome
Serve para especificar o protocolo a ser usado no socket. Exemplos: tcp ou udp.
Type => SOCK_STREAM | SOCK_DGRAM
Serve para especificar o tipo de socket a ser usado. SOCK_STREAM indica que a conexão será baseada em streaming. SOCK_DGRAM indica que o tipo de conexão será baseada em datagrama.
Listen => n
Serve para especificar o número máximo de requisições de clientes.
Reuse => 1
Se o valor do Reuse for diferente que zero, significa que o socket poderá ser reusado sem precisar ser reaberto.
Timeout => n
Serve para especificar o tempo limite que a conexão poderá levar.
A manipulação de sockets em Perl é simples, muito mais simples com o uso do IO::Socket::INET. E é sobre como usar o IO::Socket::INET que irei falar, é claro que existem outras maneiras de implementar o uso de sockets no Perl, mas não abordarei essas maneiras.
O IO::Socket::INET é criado com o método new. O método new pode receber como argumentos a seguintes opções:
PeerAddr => hostname[:porta]
Serve para especificar o host remoto e opcionalmente a porta. O hostname pode ser tanto um nome como www.vivaolinux.com.br como um número de IP na seguinte forma xxx.xxx.xxx.xxx.
PeerPort => porta
Serve para especificar o número da porta em um host remoto. Caso você não saiba o número do serviço, um nome de serviço como http, ftp poderá ser usado.
LocalAddr => hostname[:porta]
Serve para especificar um endereço local e opcionalmente a porta.
LocalPort => porta
Serve para especificar o número da porta ou o nome do serviço.
Proto => nome
Serve para especificar o protocolo a ser usado no socket. Exemplos: tcp ou udp.
Type => SOCK_STREAM | SOCK_DGRAM
Serve para especificar o tipo de socket a ser usado. SOCK_STREAM indica que a conexão será baseada em streaming. SOCK_DGRAM indica que o tipo de conexão será baseada em datagrama.
Listen => n
Serve para especificar o número máximo de requisições de clientes.
Reuse => 1
Se o valor do Reuse for diferente que zero, significa que o socket poderá ser reusado sem precisar ser reaberto.
Timeout => n
Serve para especificar o tempo limite que a conexão poderá levar.
Correção para o amigo:
no final do script de servidor faltou o fechamento do statement: "{"
Segue o corrigido.
Servidor:
#! /usr/bin/perl
use IO::Socket::INET;
use strict;
my $server_socket = IO::Socket::INET->new(
'LocalPort' => '2008',
'Proto' => 'tcp',
'Reuse' => 1,
'Listen' => SOMAXCONN
) or die "Não foi possível criar o socket. ($!)\n";
print "Servidor iniciado.\n";
while (my $cliente = $server_socket->accept){
while (<$cliente>) {
print "Mensagem recebida: $_";
print $cliente "Mensagem enviada: $_ ";
}
}