Сокет также называют «сокетом». Приложения обычно отправляют запросы в сеть или отвечают на сетевые запросы через «сокет», чтобы хосты или процессы на компьютере могли взаимодействовать.
В этой главе мы научим вас использовать службу Socket на языке Perl.
Используйте функцию сокета для создания службы сокетов.
Используйте функцию привязки для привязки порта.
Используйте функцию прослушивания для прослушивания порта.
Используйте функцию принятия для получения клиентских запросов.
Используйте функцию сокета для создания службы сокетов.
Используйте функцию подключения для подключения к серверу сокетов.
На следующей диаграмме показан процесс связи между клиентом и сервером:
В Perl мы используем функцию socket() для создания сокета. Формат синтаксиса следующий:
сокет(SOCKET, ДОМЕН, ТИП, ПРОТОКОЛ);
Анализ параметров:
Сокет, созданный DOMAIN, определяет набор протоколов. Например:
AF_INET
представляет сетевой протокол IPv4.
AF_INET6
означает IPv6
AF_UNIX
означает локальный сокет (с использованием файла)
TYPE Типы сокетов можно классифицировать как SOCK_STREAM или SOCK_DGRAM в зависимости от того, ориентированы ли они на соединение или нет.
ПРОТОКОЛ должен быть (getprotobyname('tcp'))[2] . Указывает фактический используемый транспортный протокол.
Итак, метод вызова функции сокета выглядит следующим образом:
use Socket # Определите PF_INET и SOCK_STREAMsocket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]);
Используйте метод связывания(), чтобы назначить адрес сокету:
привязать( РОЗЕТКА, АДРЕС );
SOCKET Дескриптор сокета. АДРЕС — это адрес сокета (TCP/IP), содержащий три элемента:
Кластер адресов (TCP/IP, AF_INET, возможно, 2 в вашей системе)
Номер порта (например, 21)
Сетевой адрес (например, 10.12.12.168)
После того, как сокет создан с помощью функции socket(), ему передается только используемый протокол, а адрес не назначается. Прежде чем принимать соединения от других хостов, необходимо вызвать метод Bind() для присвоения адреса сокету.
Простой пример выглядит следующим образом:
use Socket # PF_INET и SOCK_STREAM определены $port = 12345; # Порт прослушивания $server_ip_address = "10.12.12.168";bind( SOCKET, package_sockaddr_in($port, inet_aton($server_ip_address))) или die "Невозможно привязать порт! н";
или die выполняется после неудачной привязки адреса.
Установку порта можно немедленно использовать повторно, установив опцию SO_REUSEADDR в setockopt().
Функция package_sockaddr_in() преобразует адрес в двоичный формат.
После того, как сокет привязан к адресу, функция Listen() начнет прослушивать возможные запросы на соединение. Однако это можно использовать только в том случае, если гарантирован надежный поток данных:
прослушать (SOCKET, QUEUESIZE);
SOCKET: дескриптор сокета.
QUEUESIZE: это целое число, определяющее размер очереди прослушивания. Когда приходит запрос на соединение, он попадает в очередь прослушивания; когда запрос на соединение принимается функцией Accept(), он будет удален из очереди прослушивания; очередь заполнена, новое соединение. Запрос вернет ошибку.
Как только соединение будет принято, в случае успеха возвращается 0, а в случае ошибки -1.
Функция Accept() принимает запрошенное соединение сокета. Возвращает сжатую форму сетевого адреса в случае успеха, в противном случае возвращает FALSE:
принять(NEW_SOCKET, SOCKET);
NEW_SOCKET: дескриптор сокета.
SOCKET: дескриптор сокета.
Accept() обычно используется в бесконечных циклах:
while(1) {принять(NEW_SOCKET, SOCKT.....});
В приведенном выше примере можно отслеживать запросы клиентов в режиме реального времени.
Системный вызов connect() устанавливает соединение для сокета. Параметрами являются дескриптор файла и адрес хоста.
подключить(РОЗЕТКА, АДРЕС);
Следующее создает экземпляр, подключенный к сокету сервера:
$port = 21; # ftp-порт $server_ip_address = "10.12.12.168"; connect( SOCKET, package_sockaddr_in($port, inet_aton($server_ip_address))) или die "Невозможно привязать порт! n";
Далее мы используем полный пример, чтобы понять применение всех функций сокета:
Код сервера server.pl:
Откройте терминал и выполните следующий код:
$ perl sever.pl начало доступа: 7890
Код клиента client.pl:
Откройте другой терминал и выполните следующий код:
$perl client.pl — это информация с сервера