Spec-Zone.ru › Elisp

Сетевые соединения

Программы на Emacs Lisp могут открывать потоковые (TCP) и дейтаграммные (UDP) сетевые соединения (см. Дейтаграммы) с другими процессами на том же компьютере или на других компьютерах. Lisp обрабатывает сетевое соединение во многом так же, как подпроцесс, и оно представлено объектом процесса. Однако процесс, с которым вы взаимодействуете, не является дочерним процессом Emacs, у него нет идентификатора процесса ID, и вы не можете завершить его или отправить ему сигналы. Всё, что вы можете сделать, — отправлять и получать данные. delete-process закрывает соединение, но не завершает программу на другом конце; эта программа должна сама решить, что делать при закрытии соединения.

Программы на Lisp могут ожидать соединения, создавая сетевые серверы. Сетевой сервер также представлен особым видом объекта процесса, но, в отличие от сетевого соединения, сам сетевой сервер никогда не передаёт данные. Получив запрос на соединение, он создаёт новое сетевое соединение, представляющее только что установленное соединение. (Сетевое соединение наследует от сервера некоторую информацию, включая список свойств процесса.) Затем сетевой сервер возвращается к ожиданию новых запросов на соединение.

Сетевые соединения и серверы создаются вызовом make-network-process со списком аргументов, состоящим из пар «ключевое слово/аргумент», например :server t для создания серверного процесса или :type 'datagram для создания дейтаграммного соединения. Подробности см. в разделе Низкоуровневый доступ к сети. Также можно использовать описанную ниже функцию open-network-stream.

Чтобы различать разные типы процессов, функция process-type возвращает символ network для сетевого соединения или сервера, serial для соединения с последовательным портом, pipe для соединения через канал или real для настоящего подпроцесса.

Функция process-status возвращает open, closed, connect, stop или failed для сетевых соединений. Для сетевого сервера состояние всегда равно listen. Кроме stop, ни одно из этих значений невозможно для настоящего подпроцесса. См. Информация о процессах.

Останавливать и возобновлять работу сетевого процесса можно с помощью вызовов stop-process и continue-process. Для серверного процесса остановка означает, что он не принимает новые соединения. (До 5 запросов на соединение будут помещены в очередь до возобновления работы сервера; это ограничение можно увеличить, если оно не задано операционной системой, — см. ключевое слово :server функции make-network-process, make-network-process.) Для потокового сетевого соединения остановка означает, что входные данные не обрабатываются (любые поступающие данные ожидают возобновления работы соединения). Для дейтаграммного соединения некоторое количество пакетов может быть поставлено в очередь, но входные данные могут быть потеряны. Функция process-command позволяет определить, остановлено ли сетевое соединение или сервер; значение, отличное от nil, означает, что да.

Emacs может создавать зашифрованные сетевые соединения, используя встроенную поддержку библиотеки GnuTLS Transport Layer Security; см. страницу проекта GnuTLS. Если Emacs был собран с поддержкой GnuTLS, функция gnutls-available-p определена и возвращает значение, отличное от nil. Дополнительные сведения см. в разделе Обзор руководства The Emacs-GnuTLS manual. Функция open-network-stream может прозрачно обрабатывать за вас создание зашифрованных соединений, используя доступные средства поддержки.

Функция: open-network-stream name buffer host service &rest parameters

Эта функция открывает TCP-соединение, при необходимости зашифрованное, и возвращает объект процесса, представляющий это соединение.

Аргумент name задаёт имя объекта процесса. При необходимости оно изменяется, чтобы стать уникальным.

Аргумент buffer задаёт буфер, связанный с соединением. Вывод соединения вставляется в буфер, если вы не укажете собственную функцию-фильтр для обработки вывода. Если значение buffer равно nil, соединение не связано ни с одним буфером.

Аргументы host и service задают адрес подключения: host — это имя узла (строка), а service — имя определённой сетевой службы (строка) или номер порта (целое число, например 80, либо строка с целым числом, например "80").

Остальные аргументы parameters представляют собой пары «ключевое слово/аргумент», имеющие значение преимущественно для зашифрованных соединений:

:nowait boolean

Если значение отлично от nil, попытаться установить асинхронное соединение.

:noquery query-flag

Задать флаг запроса процесса равным query-flag. См. Запрос перед выходом.

:coding coding

Использовать для сетевого процесса указанные кодировки вместо связывания coding-system-for-read или coding-system-for-write. Подробности см. в разделе make-network-process.

:type type

Тип соединения. Возможные варианты:

plain

Обычное незашифрованное соединение.

tls
ssl

Соединение TLS (Transport Layer Security).

nil
network

Начать с обычного соединения и, если указаны параметры ‘:success’ и ‘:capability-command’, попытаться перейти на зашифрованное соединение с помощью STARTTLS. Если это не удастся, сохранить незашифрованное соединение.

starttls

Как nil, но при сбое STARTTLS соединение разрывается.

shell

Соединение с оболочкой.

:always-query-capabilities boolean

Если значение отлично от nil, всегда запрашивать возможности сервера, даже при установлении соединения ‘plain’.

:capability-command capability-command

Команда для запроса возможностей узла. Это может быть строка (которая будет отправлена серверу без изменений) или функция (вызываемая с одним параметром — «приветствием» сервера при подключении), которая должна возвращать строку.

:end-of-command regexp
:end-of-capability regexp

Регулярное выражение, соответствующее концу команды или команды capability-command. По умолчанию последнее значение совпадает с первым.

:starttls-function function

Функция с одним аргументом (ответом на capability-command), которая возвращает либо nil, либо команду для активации STARTTLS, если она поддерживается.

:success regexp

Регулярное выражение, соответствующее успешному согласованию STARTTLS.

:use-starttls-if-possible boolean

Если значение отлично от nil, выполнять попытки перехода на STARTTLS, даже если Emacs не имеет встроенной поддержки TLS.

:warn-unless-encrypted boolean

Если значение отлично от nil, предупреждать пользователя, если итоговый тип соединения не является зашифрованным. Это полезно для таких протоколов, как IMAP, где большинство пользователей ожидает шифрования сетевого трафика. Это может произойти из-за сбоя перехода на STARTTLS; указание :return-list со значением, отличным от nil, позволяет перехватить любую возникшую ошибку.

:client-certificate list-or-t

Либо список вида (key-file cert-file), задающий файл ключа сертификата и сам файл сертификата, либо t, означающее, что для получения этой информации нужно обратиться к auth-source (см. auth-source в Emacs auth-source Library). Используется только для TLS или STARTTLS. Чтобы включить автоматические запросы к auth-source, когда :client-certificate не задано, настройте network-stream-use-client-certificates на t.

:return-list cons-or-nil

Возвращаемое значение этой функции. Если параметр опущен или равен nil, возвращается объект процесса. В противном случае возвращается пара в виде (process-object . plist), где plist может включать следующие ключевые слова:

:greeting string-or-nil

Если значение отлично от nil, строка приветствия, возвращённая узлом.

:capabilities string-or-nil

Если значение отлично от nil, строка возможностей узла.

:type symbol

Тип соединения: ‘plain’ или ‘tls’.

:error symbol

Строка с описанием любой ошибки, возникшей при переходе на STARTTLS.

:shell-command string-or-nil

Если соединение type равно shell, этот параметр интерпретируется как строка форматирования (см. Пользовательские строки форматирования), которая будет выполнена для установки соединения. Доступны спецификаторы ‘%s’ для имени узла и ‘%p’ для номера порта. Например, если перед обычным соединением нужно сначала подключиться по ssh к ‘gateway’, значением этого параметра может быть строка вида ‘ssh gateway nc %s %p’.

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Network.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API