41.17.1 make-network-process

Основной функцией для создания сетевых соединений и сетевых серверов является make-network-process. Она может выполнять любую из этих задач в зависимости от переданных аргументов.

Функция: make-network-process &rest args

Эта функция создаёт сетевое соединение или сервер и возвращает объект процесса, который его представляет. Аргументы args представляют собой список пар ключевое_слово/значение. Отсутствие ключевого слова всегда эквивалентно указанию его со значением nil, за исключением :coding, :filter-multibyte и :reuseaddr. Ниже перечислены значимые ключевые слова (соответствующие сетевым опциям перечислены в следующем разделе):

:name name

Использовать строку name в качестве имени процесса. При необходимости оно изменяется для обеспечения уникальности.

:type type

Задаёт тип связи. Значение nil задаёт потоковое соединение (по умолчанию); datagram задаёт дейтаграммное соединение; seqpacket задаёт соединение с последовательной пакетной передачей. Соединения и серверы могут быть любого из этих типов.

:server server-flag

Если server-flag не равен nil, создаётся сервер. В противном случае создаётся соединение. Для сервера потокового типа server-flag может быть целым числом, которое задаёт длину очереди ожидающих подключений к серверу. Длина очереди по умолчанию равна 5.

:host host

Задаёт хост для подключения. host должен быть именем хоста или IP-адресом в виде строки или символом local для указания локального хоста. Если вы указываете host для сервера, он должен задавать допустимый адрес локального хоста, и будут приниматься только клиенты, подключающиеся к этому адресу. При использовании local по умолчанию используется IPv4; укажите семейство ipv6, чтобы изменить это. Для прослушивания всех интерфейсов укажите адрес ‘"0.0.0.0"’ для IPv4 или ‘"::"’ для IPv6. Учтите, что в некоторых операционных системах прослушивание ‘"::"’ также прослушивает IPv4, поэтому попытка отдельно прослушивать IPv4 приведёт к ошибкам EADDRINUSE (‘"Адрес уже используется"’).

:service service

service задаёт номер порта для подключения; или, для сервера, номер порта для прослушивания. Это должно быть имя службы, например ‘"https"’, которое преобразуется в номер порта, или целое число, например ‘443’, или строка с целым числом, например ‘"443"’, которая задаёт номер порта напрямую. Для сервера это также может быть t, что означает разрешить системе выбрать неиспользуемый номер порта.

:family family

family задаёт семейство адресов (и протоколов) для связи. nil означает автоматически определить подходящее семейство адресов для заданных host и service. local задаёт сокет Unix, в этом случае host игнорируется. ipv4 и ipv6 задают использование IPv4 и IPv6 соответственно.

:use-external-socket use-external-socket

Если use-external-socket не равен nil, использовать любые сокеты, переданные Emacs при запуске, вместо выделения нового. Это используется кодом сервера Emacs для обеспечения активации сокета по требованию. Если Emacs не был передан сокет, эта опция молча игнорируется.

:local local-address

Для серверного процесса local-address — это адрес для прослушивания. Он переопределяет family, host и service, поэтому вы можете их не указывать.

:remote remote-address

Для соединения remote-address — это адрес для подключения. Он переопределяет family, host и service, поэтому вы можете их не указывать.

Для дейтаграммного сервера remote-address задаёт начальную установку удалённого дейтаграммного адреса.

Формат local-address или remote-address зависит от семейства адресов:

  • Адрес IPv4 представляется как пятиэлементный вектор из четырёх 8-битных целых чисел и одного 16-битного целого числа [a b c d p], соответствующий числовому IPv4-адресу a.b.c.d и номеру порта p.
  • Адрес IPv6 представляется как девятиэлементный вектор из 16-битных целых чисел [a b c d e f g h p], соответствующий числовому IPv6-адресу a:b:c:d:e:f:g:h и номеру порта p.
  • Локальный адрес представляется как строка, которая задаёт адрес в локальном адресном пространстве.
  • Адрес неподдерживаемого семейства представляется как пара (f . av), где f — номер семейства, а av — вектор, задающий адрес сокета, с одним элементом на байт данных адреса. Не полагайтесь на этот формат в переносимом коде, поскольку он может зависеть от определяемых реализацией констант, размеров данных и выравнивания структур данных.
:nowait bool

Если bool не равен nil для потокового соединения, вернуть управление без ожидания завершения соединения. Когда соединение успешно устанавливается или терпит неудачу, Emacs вызывает функцию- часового, со вторым аргументом, соответствующим "open" (в случае успеха) или "failed". По умолчанию выполняется блокировка, так что make-network-process не возвращает управление, пока соединение не будет успешно установлено или не завершится ошибкой.

Если вы настраиваете асинхронное TLS-соединение, вы также должны указать параметр :tls-parameters (см. ниже).

В зависимости от возможностей Emacs, степень асинхронности :nowait может различаться. Три элемента, которые могут (или не могут) выполняться асинхронно: разрешение доменного имени, настройка сокета и (для TLS-соединений) согласование TLS.

Многие функции, взаимодействующие с объектами процессов (например, process-datagram-address), полагаются на наличие сокета, чтобы вернуть полезное значение. Эти функции будут блокироваться, пока сокет не достигнет нужного состояния. Рекомендуемый способ взаимодействия с асинхронными сокетами — назначить процессу часового и не пытаться взаимодействовать с ним, пока его статус не изменится на ‘"run"’. Тогда ни одна из этих функций не будет блокироваться.

:tls-parameters

При открытии TLS-соединения здесь должен быть указан список, где первый элемент — это тип TLS (должен быть либо gnutls-x509pki, либо gnutls-anon), а остальные элементы должны образовывать список ключевых слов, приемлемый для gnutls-boot. (Этот список ключевых слов можно получить с помощью функции gnutls-boot-parameters.) Согласование TLS будет выполнено после завершения подключения к хосту.

:stop stopped

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

:buffer buffer

Использовать buffer в качестве буфера процесса.

:coding coding

Использовать coding в качестве кодировки для этого процесса. Чтобы задать разные кодировки для декодирования данных из соединения и для кодирования данных, отправляемых в него, укажите (decoding . encoding) для coding.

Если вы вообще не указываете это ключевое слово, по умолчанию кодировки определяются из данных.

:noquery query-flag

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

:filter filter

Инициализировать фильтр процесса значением filter.

:filter-multibyte multibyte

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

:sentinel sentinel

Инициализировать часового процесса значением sentinel.

:log log

Инициализировать функцию журналирования серверного процесса значением log. Функция журналирования вызывается каждый раз, когда сервер принимает сетевое соединение от клиента. Аргументы, передаваемые функции журналирования: server, connection и message; где server — это серверный процесс, connection — новый процесс для соединения, а message — строка, описывающая произошедшее.

:plist plist

Инициализировать список свойств процесса значением plist.

Исходный список аргументов, изменённый с учётом фактической информации о соединении, доступен через функцию process-contact.