Latest web development tutorials

Gniazdo programowania Perl

Gniazdo znany również jako "gniazdo", aplikacja jest zazwyczaj wydawane przez "gniazdo" na żądanie żądanie sieci lub sieci odpowiedzi, tak aby proces między hostami lub pomiędzy komputerem on może komunikować.

Ta sekcja jest wszystko otrzymaliśmy języka Perl w jaki sposób korzystać z usług gniazda.


Tworzenie serwera

  • Użyj funkcjigniazda do tworzenia usług gniazd.

  • Użyj funkcjiwiązania do wiązania portu.

  • Użyjsłucha funkcję portu.

  • Użyjzaakceptować funkcja odbiera żądania klientów.

Tworzenie klienta

  • Użyj funkcjigniazda do tworzenia usług gniazd.

  • Korzystanie z funkcjipołączyć się podłączyć do gniazda serwera.

Poniższy wykres ilustruje przepływ komunikacji między klientem a serwerem:


Funkcja Gniazdo Server

funkcja socket

Perl, używamy funkcji socket () w celu utworzenia gniazda, składnia jest następująca:

socket( SOCKET, DOMAIN, TYPE, PROTOCOL );

Parametry analityczne:

  • Określa protokół ustawić gniazda domeny utworzony. Na przykład:

    • AF_INET wskazuje protokół sieciowy IPv4
    • AF_INET6 dla IPv6
    • AF_UNIX reprezentuje lokalnego gniazda (przy użyciu pliku)

  • Typ gniazda typu mogą być zorientowana na połączenie lub bezpołączeniowym pod SOCK_STREAM lub SOCK_DGRAM

  • Protokół powinien być(getprotobyname ( 'tcp')) [2].Określenia rzeczywistej protokołu transportowego.

Więc wywołaniu funkcji gniazda, co następuje:

use Socket     # 定义了 PF_INET 和 SOCK_STREAM

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

wiążą function ()

Za pomocą bind () przydziela adres do gniazda:

bind( SOCKET, ADDRESS );

GNIAZDO deskryptor gniazda. Adres to adres gniazda (TCP / IP) zawiera trzy elementy:

  • Rodzina adresów (TCP / IP, jest AF_INET na system może być 2)

  • Numer portu (na przykład 21)

  • adresów sieciowych (takich jak 10.12.12.168)

Po użyciu socket () tworzy gniazdo, daj protokół których używają i nie przypisywania adresów. Przed przyjęciem innego połączenia hosta, należy najpierw wywołać bind () przydziela adres do gniazda.

Proste przykłady, są następujące:

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

lub umrzeć w adresie powiązań zawiodły wykonanie.

Poprzez ustawienie setsockopt (), aby ustawić opcję SO_REUSEADDR port może być ponownie użyty natychmiast.

Funkcjapack_sockaddr_in () do konwersji adresów formacie binarnym.

słuchać function ()

Funkcja gdy gniazdo oraz adres wiążące, listen () zacznie słuchać ewentualnych żądań połączeń. Jednak może to zagwarantować niezawodny strumień danych wyłącznie przy użyciu:

listen( SOCKET, QUEUESIZE );

Gniazdo: deskryptor gniazda.

QUEUESIZE: integer jest decyzja, aby monitorować rozmiar kolejki, gdy jest żądanie połączenia przybywa, wejdzie kolejkę słuchać; gdy żądanie połączenia accept () do zaakceptowania, usunięty z monitorem kolejki, gdy kolejka jest pełna, nowe połączenia zapytanie zwróci błąd.

Gdy połączenie zostanie zaakceptowana, to zwraca 0 dla sukcesu, powrót błędzie -1.

zaakceptować function ()

Funkcja accept () akceptuje połączenie z gniazdem prośba. Jeśli sukces w postaci skompresowanej adres sieciowy, w przeciwnym wypadku zwraca FALSE:

accept( NEW_SOCKET, SOCKET );

Gniazdo: deskryptor gniazda.

Adres: Adres jest adres gniazda (TCP / IP) zawiera trzy elementy:

  • Rodzina adresów (TCP / IP, jest AF_INET na system może być 2)

  • Numer portu (na przykład 21)

  • adresów sieciowych (takich jak 10.12.12.168)

accept (), który jest zwykle stosowany w nieskończonej pętli:

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

Powyższe przykłady mogą monitorować w czasie rzeczywistym na żądania klientów.


funkcje klienta

połączyć function ()

connect () wywołanie systemowe, aby skonfigurować parametry połączenia gniazda deskryptor pliku i adres hosta.

connect( SOCKET, ADDRESS );

Poniższa tworzy połączenie z gniazdem do instancji serwera:

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

Kompletny przykład

Następnie dochodzimy do zrozumienia wszystkich funkcji aplikacji poprzez gniazdo kompletnego przykład:

Serwer Kod 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;
}

Otwórz terminal, wykonaj następujący kod:

$ perl sever.pl
访问启动:7890

Klient Kod 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: $!";

Otwórz inny terminal wykonać następujący kod:

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