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 我是来自服务端的信息