Latest web development tutorials

Perl Socket-Programmierung

Buchse auch als "Buchse" bekannt ist, wird die Anwendung in der Regel durch eine "Steckdose" an das Netzwerk Anfrage oder Antwort Netzwerk-Anforderung ausgegeben, so dass der Prozess zwischen Hosts oder zwischen einem Computer kommunizieren kann.

Dieser Abschnitt ist alles, was wir Perl Sprache erhalten, wie Socket-Dienste zu nutzen.


erstellen Server

  • Verwenden Sie dieSocket - Funktion ein Socket - Dienste zu erstellen.

  • Verwenden Sie diebind Funktion Port zu binden.

  • Verwenden Siehören Portfunktion zu hören.

  • Verwenden Sieakzeptieren Funktion Client - Anfragen empfängt.

Erstellen Sie eine Client

  • Verwenden Sie dieSocket - Funktion ein Socket - Dienste zu erstellen.

  • Mit Hilfe derVerbindungsfunktion zum Server - Socket zu verbinden.

Die folgende Tabelle zeigt den Fluss der Kommunikation zwischen dem Client und dem Server:


Server Socket-Funktion

Socket-Funktion

Perl, verwenden wir die Funktion socket () einen Socket zu erstellen, ist Syntax wie folgt:

socket( SOCKET, DOMAIN, TYPE, PROTOCOL );

Analytische Parameter:

  • Gibt das Protokoll gesetzt Buchse DOMAIN erstellt. Zum Beispiel:

    • AF_INET zeigt an IPv4 - Netzwerkprotokoll
    • AF_INET6 für IPv6
    • AF_UNIX stellt lokale Socket (unter Verwendung einer Datei)

  • Buchse Typ können verbindungsorientiert oder verbindungslos in SOCK_STREAM oder SOCK_DGRAM sein

  • PROTOKOLL sollte(getprotobyname ( 'tcp')) sein [2].Geben Sie den tatsächlichen Transportprotokoll.

So Funktionsaufruf Buchse wie folgt:

use Socket     # 定义了 PF_INET 和 SOCK_STREAM

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

bind () Funktion

Verwenden Sie bind () weisen Sie eine Adresse an die Steckdose:

bind( SOCKET, ADDRESS );

Socket Socket-Descriptor. Adresse ist die Socket-Adresse (TCP / IP) enthält drei Elemente:

  • Die Adressfamilie (TCP / IP, ist AF_INET, die auf dem System 2 sein kann)

  • Portnummer (beispielsweise 21)

  • Netzwerkadresse (zB 10.12.12.168)

Nach der Verwendung des socket () erzeugt einen Socket, geben nur das Protokoll sie verwenden, und weisen keine Adressen. Bevor die anderen Host-Verbindung zu akzeptieren, müssen Sie zuerst anrufen bind () weisen Sie eine Adresse in eine Steckdose.

Einfache Beispiele sind wie folgt:

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

oder sterben in der bind - Adresse fehlgeschlagene Ausführung.

Durch die Einstellung der setsockopt () SO_REUSEADDR Option, um den Port einstellen kann sofort wieder verwendet werden.

pack_sockaddr_in () Funktionsadressen in binäre Format zu konvertieren.

Funktion listen ()

Wenn die Buchse und eine Adresse verbindlich, hören () Funktion hören für mögliche Verbindungsanfragen zu starten. Dies kann jedoch nur dann zuverlässig Datenstrom gewährleistet bei Verwendung von:

listen( SOCKET, QUEUESIZE );

Sockel: ein Descriptor-Buchse.

QUEUESIZE: integer ist eine Entscheidung, die Größe der Warteschlange zu überwachen, wenn es eine Verbindungsanfrage ankommt ist, es wird die hören Warteschlange eingeben, wenn eine Verbindungsanfrage annehmen () ist, aus der Warteschlange Monitor entfernt zu akzeptieren, und wenn die Warteschlange voll ist, neue Verbindungen Anfrage einen Fehler zurück.

Sobald die Verbindung akzeptiert wird, gibt es 0 für den Erfolg, Fehler return -1.

accept () Funktion

accept () Funktion akzeptiert die Anfrage Socket-Verbindung. Wenn erfolgreich die Netzwerkadresse in komprimierter Form, sonst FALSCH:

accept( NEW_SOCKET, SOCKET );

Sockel: ein Descriptor-Buchse.

Adresse: Adresse ist die Socket-Adresse (TCP / IP) enthält drei Elemente:

  • Die Adressfamilie (TCP / IP, ist AF_INET, die auf dem System 2 sein kann)

  • Portnummer (beispielsweise 21)

  • Netzwerkadresse (zB 10.12.12.168)

accept (), die in der Regel in einer Endlos-Schleife angelegt wird:

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

Die obigen Beispiele können in Echtzeit auf Client-Anfragen zu überwachen.


Client-Funktionen

connect () Funktion

() Systemaufruf verbinden eine Socket-Verbindungsparameter Dateideskriptors einzurichten und die Host-Adresse.

connect( SOCKET, ADDRESS );

Die folgende erstellt eine Socket-Verbindung zum Server-Instanz:

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

Komplettes Beispiel

Als nächstes kommen wir alle Socket-Anwendungen Funktion durch ein komplettes Beispiel zu verstehen:

Server server.pl Code:

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

Öffnen Sie ein Terminal, führen Sie den folgenden Code:

$ perl sever.pl
访问启动:7890

Client-client.pl Code:

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

Öffnen Sie ein weiteres Terminal, führen Sie den folgenden Code:

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