Latest web development tutorials

La programación Perl Socket

Socket también conocido como "toma", la aplicación se emite generalmente por una "toma" a la petición de solicitud de red o red de respuesta, por lo que el proceso entre hosts, o entre un equipo en el se puede comunicar.

Esta sección es toda recibimos lenguaje Perl cómo utilizar los servicios de socket.


crear servidor

  • Utilice la función desocket para crear un servicio de socket.

  • Utilice la funciónde enlace para unir el puerto.

  • Utilicelistening función del puerto.

  • Utiliceaceptar función recibe solicitudes de los clientes.

Crear un cliente

  • Utilice la función desocket para crear un servicio de socket.

  • Uso de la función deconexión para conectar a la toma de servidor.

El siguiente gráfico ilustra el flujo de comunicación entre el cliente y el servidor:


la función socket del servidor

función de socket

Perl, se utiliza la función socket () para crear un socket, la sintaxis es la siguiente:

socket( SOCKET, DOMAIN, TYPE, PROTOCOL );

parámetros analíticos:

  • Especifica el protocolo establecido DOMINIO socket creado. Por ejemplo:

    • AF_INET indica protocolo de red IPv4
    • AF_INET6 para IPv6
    • AF_UNIX representa un conector local (mediante un archivo)

  • Tipo Tipo de conector hembra puede ser orientado a la conexión o sin conexión en SOCK_STREAM o SOCK_DGRAM

  • PROTOCOLO debe ser(getprotobyname ( 'tcp')) [2].Especificar el protocolo de transporte real.

Así la llamada de función toma la siguiente forma:

use Socket     # 定义了 PF_INET 和 SOCK_STREAM

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

la función bind ()

Utilice bind () asignar una dirección a la toma de corriente:

bind( SOCKET, ADDRESS );

Socket un descriptor de socket. Dirección es la dirección de socket (TCP / IP) contiene tres elementos:

  • familia de direcciones (TCP / IP, es AF_INET, en su sistema puede ser de 2)

  • número de puerto (por ejemplo, 21)

  • de direcciones de red (como 10.12.12.168)

Después de usar el socket () crea un socket, acaba de dar el protocolo que utilizan y no asigna direcciones. Antes de aceptar la otra conexión de host, primero debe llamar a bind () asignar una dirección a una toma de corriente.

Ejemplos simples son los siguientes:

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";

o morir en la dirección de enlace ejecución fallida.

Al establecer la opción SO_REUSEADDR setsockopt () para establecer el puerto se puede reutilizar inmediatamente.

funciónpack_sockaddr_in () para convertir direcciones a formato binario.

escuchar la función ()

Cuando la función de unión a la toma de corriente y una dirección, listen () va a empezar a escuchar las posibles solicitudes de conexión. Sin embargo, esto sólo puede garantizar flujo de datos fiable cuando se utiliza:

listen( SOCKET, QUEUESIZE );

TOMA: un descriptor de socket.

QUEUESIZE: entero es una decisión de controlar el tamaño de la cola, cuando hay una petición de conexión, que entrará en la cola de escucha; cuando una solicitud de conexión es aceptar () para aceptar, alejado del monitor de la cola, y cuando la cola está llena, las conexiones nuevas solicitud devolverá un error.

Una vez que se acepta la conexión, devuelve 0 para el éxito, devuelve un error, -1.

aceptar la función ()

la función accept () acepta la solicitud de conexión de socket. Si tiene éxito en forma comprimida la dirección de red, de lo contrario, devuelve FALSO:

accept( NEW_SOCKET, SOCKET );

TOMA: un descriptor de socket.

Dirección: Dirección es la dirección de socket (TCP / IP) contiene tres elementos:

  • familia de direcciones (TCP / IP, es AF_INET, en su sistema puede ser de 2)

  • número de puerto (por ejemplo, 21)

  • de direcciones de red (como 10.12.12.168)

accept (), que por lo general se aplica en un bucle infinito:

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

Los ejemplos anteriores pueden supervisar en tiempo real a las solicitudes del cliente.


funciones cliente

conectar la función ()

conectar la llamada al sistema () para establecer una toma de parámetros de conexión descriptor de archivo y la dirección del host.

connect( SOCKET, ADDRESS );

A continuación se crea una conexión de socket a la instancia del 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";

ejemplo completo

A continuación llegamos a comprender todas las funciones de las aplicaciones de socket a través de un ejemplo 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;
}

Abre un terminal, ejecute el siguiente 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 otro terminal, ejecute el siguiente código:

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