Latest web development tutorials

Perl Socket программирования

Разъем также известный как "гнездо", приложение, как правило, выдается на "гнездо" на запрос запроса сети или сети ответ, так что процесс между узлами или между компьютером на могут общаться.

В этом разделе все мы получили Perl язык, как использовать Socket Services.


Создание сервера

  • Используйте функциюсокета для создания сокета услуги.

  • Используйте функциюпривязки , чтобы связать порт.

  • Используйте функцию прослушивания дляпрослушивания порта.

  • Используйтепринимает функция принимает запросы клиентов.

Создание клиента

  • Используйте функциюсокета для создания сокета услуги.

  • Использование функцииСоединить для подключения к разъему сервера.

Следующая диаграмма иллюстрирует поток передачи данных между клиентом и сервером:


Функция сокета сервера

функция сокета

Perl, мы используем функцию сокета () для создания сокета, синтаксис выглядит следующим образом:

socket( SOCKET, DOMAIN, TYPE, PROTOCOL );

Аналитические параметры:

  • Определяет протокол установлен доменный сокет , созданный. Например:

    • AF_INET указывает сетевой протокол IPv4
    • AF_INET6 для IPv6
    • AF_UNIX представляет локальный сокет (используя файл)

  • Тип тип сокета может быть ориентированным на соединение или в SOCK_STREAM установления соединения или SOCK_DGRAM

  • ПРОТОКОЛ должно быть(getprotobyname ( 'TCP')) [2].Укажите фактический транспортный протокол.

Так вызов сокета функции следующим образом:

use Socket     # 定义了 PF_INET 和 SOCK_STREAM

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

Функция привязки ()

Используйте привязку () назначить адрес сокета:

bind( SOCKET, ADDRESS );

Сокетом дескриптор сокета. Это адрес сокета (TCP / IP) содержит три элемента:

  • Семейство адресов (TCP / IP, является AF_INET, на вашей системе может быть 2)

  • Номер порта (например, 21)

  • Сетевой адрес (например, 10.12.12.168)

После того, как с использованием сокета () создает сокет, просто дать протокол они используют и не присваивать адреса. Перед тем как принять другое соединение хоста, необходимо сначала вызвать Bind () назначить адрес сокета.

Простые примеры являются следующие:

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

или умереть в адрес произошел сбой привязки исполнения.

Установив опцию SO_REUSEADDR setsockopt (), чтобы установить порт может быть повторно использован немедленно.

Функцияpack_sockaddr_in () для преобразования адреса в двоичный формат.

слушать функции ()

Функция Когда сокет и адрес привязки, слушать () начнет прослушивание возможных запросов на установление соединения. Тем не менее, это может гарантировать надежный поток данных только при использовании:

listen( SOCKET, QUEUESIZE );

Цоколь: дескриптор сокета.

QUEUESIZE: целое число является решением для контроля размера очереди, когда есть прибывает запрос на соединение, оно вступит прослушивания очереди, когда запрос на соединение принимает (), чтобы принять, удалены от монитора очереди, когда очередь заполнена, новые соединения запрос вернет ошибку.

После того, как соединение принято, она возвращает 0 в случае успеха, возвращения ошибки -1.

принимает функция ()

Функция принимает () принимает соединение запрос сокета. В случае успеха в сжатой форме сетевой адрес, в противном случае она возвращает FALSE:

accept( NEW_SOCKET, SOCKET );

Цоколь: дескриптор сокета.

АДРЕС: АДРЕС адрес сокета (TCP / IP) содержит три элемента:

  • Семейство адресов (TCP / IP, является AF_INET, на вашей системе может быть 2)

  • Номер порта (например, 21)

  • Сетевой адрес (например, 10.12.12.168)

принимаем (), который обычно применяется в бесконечном цикле:

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

Приведенные выше примеры могут отслеживать в режиме реального времени на клиентские запросы.


функции клиента

подключить функцию ()

подключить) системный вызов (настроить параметры соединения сокета дескриптор файла и адрес хоста.

connect( SOCKET, ADDRESS );

Следующий пример создает сокет подключения к экземпляру сервера:

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

Полный пример

Далее мы начинаем понимать все сокет приложения работают через полный пример:

Сервер Код 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;
}

Откройте терминал, выполните следующий код:

$ perl sever.pl
访问启动:7890

Клиент 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: $!";

Откройте другой терминал, выполнить следующий код:

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