Программы на 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 может прозрачно обрабатывать детали создания зашифрованных подключений за вас, используя любую доступную поддержку.
Эта функция открывает TCP-подключение, с возможным шифрованием, и возвращает объект процесса, представляющий это подключение.
Аргумент имя задаёт имя для объекта процесса. При необходимости оно изменяется для обеспечения уникальности.
Аргумент буфер — это буфер, связываемый с подключением. Вывод из подключения вставляется в этот буфер, если вы не зададите собственную функцию фильтра для обработки вывода. Если буфер равен nil, это означает, что подключение не связано ни с каким буфером.
Аргументы узел и служба определяют, куда подключаться; узел — это имя узла (строка), а служба — это имя определённой сетевой службы (строка) или номер порта (целое число, например 80, или строка-целое, например "80").
Остальные аргументы параметры — это пары ключ/значение, которые в основном важны для зашифрованных подключений:
:nowait логическоеЕсли не nil, попытаться установить асинхронное подключение.
:noquery флаг-опросаИнициализировать флаг опроса процесса значением флаг-опроса. См. Опрос перед выходом.
:coding кодировкаИспользуйте это, чтобы задать системы кодировки, используемые сетевым процессом, вместо привязки coding-system-for-read или coding-system-for-write. См. make-network-process для подробностей.
:type типТип подключения. Варианты:
plainОбычное незашифрованное подключение.
tlssslПодключение по TLS (Transport Layer Security).
nilnetworkНачать с обычного подключения, и если заданы параметры ‘: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’.