Сетевые соединения
Программы на 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Обычное незашифрованное соединение.
tlssslСоединение TLS (Transport Layer Security).
nilnetworkНачать с обычного соединения и, если указаны параметры ‘: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