Latest web development tutorials

Perl soquete de programação

Tomada também conhecida como "encaixe", a aplicação é normalmente emitido por um "encaixe" ao pedido de rede ou rede de resposta de pedido, de modo que o processo entre os hospedeiros ou entre um computador pode comunicar.

Esta seção é tudo o que recebeu a linguagem Perl como usar os serviços de soquete.


Criar servidor

  • Use a funçãode soquete para criar um serviço de soquete.

  • Use a funçãode ligação para ligar a porta.

  • Useescutar escute função de porta.

  • Useaceitar função recebe pedidos de clientes.

Criar um cliente

  • Use a funçãode soquete para criar um serviço de soquete.

  • Usando a função deconexão para ligar à tomada de servidor.

O gráfico a seguir ilustra o fluxo de comunicação entre o cliente eo servidor:


função de servidor socket

função do socket

Perl, usamos a função socket () para criar um socket, a sintaxe é a seguinte:

socket( SOCKET, DOMAIN, TYPE, PROTOCOL );

parâmetros analíticos:

  • Especifica o conjunto de protocolo de soquete do domínio criado. Por exemplo:

    • AF_INET indica protocolo de rede IPv4
    • AF_INET6 para IPv6
    • AF_UNIX representa socket local (usando um arquivo)

  • tipo de soquete tipo pode ser orientado por conexão ou sem conexão em SOCK_STREAM ou SOCK_DGRAM

  • Protocolo deve ser(getprotobyname ( 'tcp')) [2].Especifique o protocolo de transporte real.

Assim, a chamada de função do socket da seguinte forma:

use Socket     # 定义了 PF_INET 和 SOCK_STREAM

socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]);

função bind ()

Use bind () atribuir um endereço para o socket:

bind( SOCKET, ADDRESS );

Soquete de um descritor de socket. Endereço é o endereço de socket (TCP / IP) contém três elementos:

  • família de endereços (TCP / IP, é AF_INET, no seu sistema pode ser de 2)

  • número da porta (como 21)

  • endereço de rede (como 10.12.12.168)

Depois de usar o socket () cria um socket, basta dar o protocolo que usar e não atribuir endereços. Antes de aceitar o outro conexão de host, você deve primeiro chamar bind () atribuir um endereço a uma tomada.

Exemplos simples são como se segue:

use Socket        # 定义了 PF_INET 和 SOCK_STREAM

$port = 12345;    # 监听的端口
$server_ip_address = "10.12.12.168";
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address)))
   or die "无法绑定端口! \n";

ou morrer o endereço de ligação falhou execução.

Ao definir a opção SO_REUSEADDR setsockopt () para definir a porta pode ser reutilizada imediatamente.

funçãopack_sockaddr_in () para converter endereços em formato binário.

ouvir function ()

função quando o soquete e um endereço de ligação, listen () vai começar a ouvir os pedidos de conexão possíveis. No entanto, isso só pode garantir fluxo de dados confiável quando se utiliza:

listen( SOCKET, QUEUESIZE );

Socket: um descritor de socket.

QUEUESIZE: inteiro é uma decisão para controlar o tamanho da fila, quando existe um pedido de ligação chega, ele entrará na fila de escuta, quando um pedido de ligação é aceite () para aceitar, removido a partir do monitor de fila; quando a fila está cheia, novas ligações pedido retornará um erro.

Assim que a conexão for aceito, ele retorna 0 para o sucesso, o retorno de erro -1.

aceitar function ()

aceitar função () aceita a solicitação de conexão socket. Se for bem sucedido na forma comprimida o endereço de rede, caso contrário, retorna FALSE:

accept( NEW_SOCKET, SOCKET );

Socket: um descritor de socket.

ENDEREÇO: endereço é o endereço de socket (TCP / IP) contém três elementos:

  • família de endereços (TCP / IP, é AF_INET, no seu sistema pode ser de 2)

  • número da porta (como 21)

  • endereço de rede (como 10.12.12.168)

aceitar (), que é normalmente aplicada num ciclo infinito:

while(1) {
   accept( NEW_SOCKET, SOCKT );
   .......
}

Os exemplos acima podem monitorar em tempo real às solicitações do cliente.


funções do cliente

conecte function ()

conecte chamada system () para configurar uma tomada de parâmetros de conexão descritor de arquivo eo endereço do host.

connect( SOCKET, ADDRESS );

O que se segue cria uma conexão de soquete para a instância do servidor:

$port = 21;    #  ftp 端口
$server_ip_address = "10.12.12.168";
connect( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address)))
    or die "无法绑定端口! \n";

exemplo completo

Em seguida, vêm a compreender todas as funções aplicativos de soquete por meio de um exemplo completo:

Código server.pl servidor:

#!/usr/bin/perl -w
# Filename : server.pl

use strict;
use Socket;

# 使用端口 7890 作为默认值
my $port = shift || 7890;
my $proto = getprotobyname('tcp');
my $server = "localhost";  # 设置本地地址

# 创建 socket, 端口可重复使用,创建多个连接
socket(SOCKET, PF_INET, SOCK_STREAM, $proto)
   or die "无法打开 socket $!\n";
setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1)
   or die "无法设置 SO_REUSEADDR $!\n";

# 绑定端口并监听
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
   or die "无法绑定端口 $port! \n";

listen(SOCKET, 5) or die "listen: $!";
print "访问启动:$port\n";

# 接收请求
my $client_addr;
while ($client_addr = accept(NEW_SOCKET, SOCKET)) {
   # send them a message, close connection
   my $name = gethostbyaddr($client_addr, AF_INET );
   print NEW_SOCKET "我是来自服务端的信息";
   print "Connection recieved from $name\n";
   close NEW_SOCKET;
}

Abra um terminal, execute o seguinte código:

$ perl sever.pl
访问启动:7890

Código client.pl Cliente:

#!/usr/bin/perl -w
# Filename : client.pl

use strict;
use Socket;

# 初始化地址与端口
my $host = shift || 'localhost';
my $port = shift || 7890;
my $server = "localhost";  # 主机地址

# 创建 socket 并连接
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2])
   or die "无法创建 socket $!\n";
connect( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
   or die "无法连接:port $port! \n";

my $line;
while ($line = <SOCKET>) {
        print "$line\n";
}
close SOCKET or die "close: $!";

Abrir outro terminal, execute o seguinte código:

$ perl client.pl
我是来自服务端的信息