Latest web development tutorials

Perl presa di programmazione

Socket noto anche come "presa", l'applicazione viene emesso solitamente da una "presa" alla richiesta richiesta di rete o rete di risposta, in modo che il processo tra host o tra un computer su può comunicare.

Questa sezione è interamente abbiamo ricevuto linguaggio Perl come utilizzare i servizi Socket.


creazione di server

  • Utilizzare la funzione dipresa per creare un socket.

  • Utilizzare la funzionebind associare la porta.

  • Utilizzare la funzioneascolto porta di ascolto.

  • Utilizzareaccetta funzione riceve le richieste dei client.

Creazione di un client

  • Utilizzare la funzione dipresa per creare un socket.

  • Utilizzando la funzionedi connessione per il collegamento alla presa di corrente del server.

La seguente tabella illustra il flusso di comunicazione tra il client e il server:


funzione di presa Server

funzione di presa

Perl, usiamo la funzione socket () per creare un socket, la sintassi è la seguente:

socket( SOCKET, DOMAIN, TYPE, PROTOCOL );

Parametri analitici:

  • Specifica il protocollo impostato presa dominio creato. Ad esempio:

    • AF_INET indica protocollo di rete IPv4
    • AF_INET6 per IPv6
    • AF_UNIX rappresenta socket locale (utilizzando un file)

  • tipo di socket TYPE può essere orientato alla connessione o senza connessione in SOCK_STREAM o SOCK_DGRAM

  • Protocollo deve essere(getprotobyname ( 'tcp')) [2].Specificare il protocollo di trasporto vero e proprio.

Quindi la chiamata di funzione presa come segue:

use Socket     # 定义了 PF_INET 和 SOCK_STREAM

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

bind function ()

Utilizzare bind () assegnare un indirizzo alla presa:

bind( SOCKET, ADDRESS );

PRESA un descrittore di socket. Indirizzo è l'indirizzo socket (TCP / IP) contiene tre elementi:

  • famiglia di indirizzi (TCP / IP, è AF_INET, sul sistema può essere 2)

  • Numero di porta (ad esempio 21)

  • Indirizzo di rete (come ad esempio 10.12.12.168)

Dopo aver utilizzato il socket () crea un socket, basta dare il protocollo che usano e non assegna gli indirizzi. Prima di accettare l'altra connessione host, è necessario innanzitutto chiamare bind () assegnare un indirizzo ad una presa di corrente.

Semplici esempi sono i seguenti:

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 morire l'indirizzo bind fallito esecuzione.

Impostando l'opzione SO_REUSEADDR setsockopt () per impostare la porta può essere riutilizzato immediatamente.

Funzionepack_sockaddr_in () per convertire gli indirizzi in formato binario.

ascoltare function ()

Funzione Quando si associa la presa e un indirizzo, ascoltare () inizierà ad ascoltare per eventuali richieste di connessione. Tuttavia, questo può garantire solo flusso di dati affidabile quando si utilizza:

listen( SOCKET, QUEUESIZE );

PRESA: un descrittore di socket.

QUEUESIZE: integer è una decisione per controllare la dimensione della coda, quando vi è una richiesta di collegamento arriva, entrerà coda in ascolto, quando una richiesta di connessione è accetta () per accettare, rimosso dal monitor di coda, quando la coda è piena, nuove connessioni richiesta restituirà un errore.

Una volta che la connessione viene accettata, restituisce 0 per il successo, il ritorno di errore -1.

accettare function ()

funzione di accettare () accetta la connessione richiesta di presa. In caso di successo in forma compressa l'indirizzo di rete, altrimenti restituisce FALSE:

accept( NEW_SOCKET, SOCKET );

PRESA: un descrittore di socket.

INDIRIZZO: indirizzo è l'indirizzo socket (TCP / IP) contiene tre elementi:

  • famiglia di indirizzi (TCP / IP, è AF_INET, sul sistema può essere 2)

  • Numero di porta (ad esempio 21)

  • Indirizzo di rete (come ad esempio 10.12.12.168)

accept () che di solito è applicata in un ciclo infinito:

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

Gli esempi di cui sopra possono monitorare in tempo reale alle richieste dei client.


funzioni client

collegare function ()

collegare chiamata di sistema () per impostare una presa di parametri di connessione file di descrizione e l'indirizzo host.

connect( SOCKET, ADDRESS );

Di seguito crea una connessione socket per l'istanza del server:

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

esempio completo

Poi si arriva a comprendere tutte le funzioni applicazioni socket attraverso un esempio completo:

Server Codice server.pl:

#!/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;
}

Aprire un terminale, eseguire il codice seguente:

$ perl sever.pl
访问启动:7890

Cliente Codice client.pl:

#!/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: $!";

Aprire un altro terminale, eseguire il codice seguente:

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