GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Network-Processes.html ・ emacs-doc.conao3.com

41.17.1 make-network-process

ネットワーク接続やネットワークサーバーを作成するための基本機能は make-network-process です。渡す引数に応じて、これらいずれかの処理を行うことができます。

関数: make-network-process &rest args

この関数は、ネットワーク接続またはサーバーを作成し、それを表すプロセスオブジェクトを返します。引数 args は、キーワードと引数のペアのリストです。キーワードを省略することは、:coding、:filter-multibyte、:reuseaddr を除き、常に値 nil で指定することと同等です。意味のあるキーワードは以下の通りです(ネットワークオプションに対応するものは次節に記載されています)。

:name name

プロセス名には文字列 name を使用してください。必要に応じて、一意になるよう変更されます。

:type type

通信タイプを指定します。nil はストリーム接続(デフォルト)、datagram はデータグラム接続、seqpacket はシーケンス付きパケットストリーム接続を指定します。接続とサーバーのいずれも、これらのタイプを指定できます。

:server server-flag

server-flag が nil 以外の場合は、サーバーを作成します。それ以外の場合は、コネクションを作成します。ストリーム型サーバーの場合、server-flag は整数を指定でき、これによりサーバーへの保留中のコネクションキューの長さが指定されます。デフォルトのキュー長は 5 です。

:host host

接続先のホストを指定します。host にはホスト名またはインターネットアドレスを文字列で指定するか、ローカルホストを指定する場合は記号 local を使用します。サーバーとして host を指定した場合は、ローカルホストの有効なアドレスを指定する必要があり、そのアドレスに接続するクライアントのみが受け付けられます。local を使用する場合、デフォルトでは IPv4 が使用されます。これを上書きするには、family または ipv6 を指定してください。すべてのインターフェースで待ち受けるには、IPv4 の場合は ‘"0.0.0.0"’、IPv6 の場合は ‘"::"’ というアドレスを指定します。なお、一部のオペレーティングシステムでは、‘"::"’ で待ち受けると IPv4 でも待ち受けることになるため、その後に別途 IPv4 で待ち受けようとすると EADDRINUSE エラー (‘"Address already in use"’) が発生します。

: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アドレスは、数値形式のIPv4アドレスa.b.c.dおよびポート番号pに対応する、4つの8ビット整数と1つの16ビット整数[a b c d p]からなる5要素のベクトルとして表現される。
  • IPv6アドレスは、数値形式のIPv6アドレス a:b:c:d:e:f:g:h およびポート番号 p に対応する、16ビット整数の9要素ベクトル [a b c d e f g h p] として表現される。
  • ローカルアドレスは文字列で表現され、ローカルアドレス空間におけるアドレスを指定します。
  • サポートされていないファミリーのアドレスは cons (f . av) で表され、ここで f はファミリー番号、av はアドレスデータの1バイトにつき1つの要素を用いてソケットアドレスを指定するベクトルとなります。この形式は、実装定義の定数やデータサイズ、データ構造のアライメントに依存する可能性があるため、移植性の高いコードでは使用しないでください。
:nowait bool

ストリーム接続において bool が nil 以外である場合は、接続が完了するのを待たずに戻ります。接続が成功または失敗すると、Emacs はセンチネル関数を呼び出します。その際、第2引数には "open"(成功時)または "failed" が渡されます。デフォルトではブロックされるため、接続が成功または失敗するまで make-network-process は戻りません。

非同期TLS接続を設定する場合は、:tls-parametersパラメータも指定する必要があります(以下を参照)。

Emacsの機能によって、非同期処理 :nowait の適用範囲は異なる場合があります。非同期で実行される(あるいはされない)可能性がある3つの要素は、ドメイン名解決、ソケットのセットアップ、および(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関数をlogに初期化する。log関数は、サーバーがクライアントからのネットワーク接続を受け付けるたびに呼び出される。log関数に渡される引数はserver、connection、およびmessageであり、ここでserverはサーバープロセス、connectionは接続用の新規プロセス、messageは何が発生したかを説明する文字列である。

:plist plist

プロセスplistをplistに初期化する。

実際の接続情報で修正された元の引数リストは、process-contact関数経由で利用可能です。