41.14 Сетевые подключения

Программы на Emacs Lisp могут открывать потоковые (TCP) и дейтаграммные (UDP) сетевые подключения (см. Дейтаграммы) к другим процессам на том же компьютере или других компьютерах. Сетевое подключение обрабатывается в Lisp во многом подобно дочернему процессу и представлено объектом процесса. Однако процесс, с которым вы общаетесь, не является дочерним по отношению к процессу Emacs, не имеет идентификатора процесса (PID), и вы не можете его завершить или отправлять ему сигналы. Всё, что вы можете делать — отправлять и получать данные. 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. Для получения более подробной информации см. Обзор в Руководстве Emacs-GnuTLS. Функция open-network-stream может прозрачно обрабатывать детали создания зашифрованных подключений за вас, используя любую доступную поддержку.

Функция: open-network-stream имя буфер узел служба &rest параметры

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

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

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

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

Остальные аргументы параметры — это пары ключ/значение, которые в основном важны для зашифрованных подключений:

:nowait логическое

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

:noquery флаг-опроса

Инициализировать флаг опроса процесса значением флаг-опроса. См. Опрос перед выходом.

:coding кодировка

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

:type тип

Тип подключения. Варианты:

plain

Обычное незашифрованное подключение.

tls
ssl

Подключение по TLS (Transport Layer Security).

nil
network

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

starttls

Как для nil, но если STARTTLS не удаётся, разорвать подключение.

shell

Оболочечное подключение.

:always-query-capabilities логическое

Если не nil, всегда запрашивать возможности сервера, даже при обычном (‘plain’) подключении.

:capability-command команда-возможностей

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

:end-of-command регулярное-выражение
:end-of-capability регулярное-выражение

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

:starttls-function функция

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

:success регулярное-выражение

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

:use-starttls-if-possible логическое

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

:warn-unless-encrypted логическое

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

:client-certificate список-или-t

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

:return-list cons-или-nil

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

:greeting строка-или-nil

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

:capabilities строка-или-nil

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

:type символ

Тип подключения: ‘plain’ или ‘tls’.

:error символ

Строка, описывающая любую ошибку, возникшую при обновлении до STARTTLS.

:shell-command строка-или-nil

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