make-network-process
¶ネットワーク接続やネットワークサーバーを作成するための基本機能は make-network-process です。渡す引数に応じて、これらいずれかの処理を行うことができます。
この関数は、ネットワーク接続またはサーバーを作成し、それを表すプロセスオブジェクトを返します。引数 args は、キーワードと引数のペアのリストです。キーワードを省略することは、:coding、:filter-multibyte、:reuseaddr
を除き、常に値 nil
で指定することと同等です。意味のあるキーワードは以下の通りです(ネットワークオプションに対応するものは次節に記載されています)。
:name nameプロセス名には文字列 name を使用してください。必要に応じて、一意になるよう変更されます。
:type type通信タイプを指定します。nil はストリーム接続(デフォルト)、datagram はデータグラム接続、seqpacket
はシーケンス付きパケットストリーム接続を指定します。接続とサーバーのいずれも、これらのタイプを指定できます。
:server server-flagserver-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 serviceservice
は接続先のポート番号を、サーバーの場合は待ち受けポート番号を指定します。ポート番号に変換される ‘"https"’ のようなサービス名か、あるいはポート番号を直接指定する
‘443’ のような整数、または ‘"443"’
のような整数文字列である必要があります。サーバーの場合は、システムに未使用のポート番号を選択させる t とすることも可能です。
:family familyfamily は通信に使用するアドレス(およびプロトコル)ファミリーを指定します。nil は、指定された host および service に応じて適切なアドレスファミリーを自動的に決定することを意味します。local は Unix ソケットを指定し、その場合 host
は無視されます。ipv4 および ipv6
は、それぞれ IPv4 と IPv6 を使用することを指定します。
:use-external-socket use-external-socketuse-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 の形式は、アドレスファミリーによって異なります:
[a b c d p]からなる5要素のベクトルとして表現される。
[a b c d e f g h p] として表現される。
(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-parametersTLS接続を開く際、最初の要素がTLSタイプ(gnutls-x509pkiまたはgnutls-anonのいずれかである必要があり、残りの要素はgnutls-bootで許容されるキーワードリストを構成する必要があります)となるべきです。(このキーワードリストはgnutls-boot-parameters関数から取得できます。)その後、ホストへの接続が完了した後、TLS接続のネゴシエーションが行われます。
:stop stoppedstopped が nil
以外の場合、ネットワーク接続またはサーバーを停止状態で起動します。
:buffer bufferプロセスバッファとして buffer を使用してください。
:coding codingこの処理の符号化方式として coding
を使用してください。接続からのデータの復号と、そこへ送信するデータの符号化で異なる符号化方式を指定するには、(decoding . encoding) と coding
を指定してください。
このキーワードを一切指定しない場合、デフォルトではデータから符号化方式を判定します。
:noquery query-flagプロセスクエリフラグをquery-flagに初期化します。終了前のクエリを参照してください。
:filter filterプロセスフィルタをfilterに初期化する。
:filter-multibyte multibytemultibyte が nil
以外の場合、プロセスフィルタに渡される文字列はマルチバイトとなり、それ以外の場合はユニバイトとなります。デフォルトは t です。
:sentinel sentinelプロセスセンティネルをsentinelに初期化する。
:log logサーバープロセスのlog関数をlogに初期化する。log関数は、サーバーがクライアントからのネットワーク接続を受け付けるたびに呼び出される。log関数に渡される引数はserver、connection、およびmessageであり、ここでserverはサーバープロセス、connectionは接続用の新規プロセス、messageは何が発生したかを説明する文字列である。
:plist plistプロセスplistをplistに初期化する。
実際の接続情報で修正された元の引数リストは、process-contact関数経由で利用可能です。