make-network-process
¶ネットワーク接続やネットワークサーバーを作成する基本的な関数はmake-network-process
です。これは与えられた引数に応じて、これらの仕事のいずれかを行うことができます。
この関数はネットワーク接続やサーバーを作成して、それを表すプロセスオブジェクトをリターンする。引数argsはキーワード/引数のペアからなるリスト。キーワードの省略は:coding
、:filter-multibyte
、:reuseaddr
を除いて、常に値としてnil
を指定したのと同じことになる。重要なキーワードを以下に示す(ネットワークオプションに対応するキーワードを以降のセクションにリストする)。
:name name
プロセス名として文字列nameを使用する。一意にするために必要に応じて変更され得る。
:type type
コミュニケーションのタイプを指定する。値nil
はストリーム接続(デフォルト)、datagram
はデータグラム接続、seqpacket
はシーケンスパケットストリーム(sequenced
packet stream)による接続を指定する。接続およびサーバーの両方でこれらのタイプを指定できる。
:server server-flag
server-flagが非nil
ならサーバー、それ以外なら接続を作成する。ストリームタイプのサーバーではserver-flagはそのサーバーへの保留中の接続キューの長さを指定する整数を指定できる。キューのデフォルト長は5。
:host host
接続するホストを指定する。hostはホスト名かインターネットアドレス(文字列)、またはローカルホストを指定するシンボルlocal
。サーバーをhostに指定する場合にはローカルホストにとって有効なアドレスを指定しなければならず、そのアドレスへはクライアント接続だけが許可されるようになる。local
を使用する際にはデフォルトではIPv4を使用するが、ipv6
のfamilyを指定してこれをオーバーライドできる。すべてのインターフェースをlistenするにはIPv4では‘"0.0.0.0"’、IPv6では‘"::"’を指定する。いくつかのオペレーティングシステムでは‘"::"’をlistenするとIPv4もlistenするので、その後で別個にIPv4のlistenを試みると結果はエラーEADDRINUSE
(‘"Address already in use"’)となるだろう。
:service service
serviceは接続先のポート番号、またはサーバーにたいしてはlistenするポート番号である。これは‘"https"’のようにポート番号に変換されるようなサービス名、または直接ポート番号を指定する‘443’のような整数か‘"443"’のような整数文字列であること。サーバーにたいしてはt
も指定でき、これは未使用のポート番号をシステムに選択させることを意味する。
:family family
familyは接続のアドレス(またはプロトコル)のファミリーを指定する。nil
は与えられたhostとserviceにたいして自動的に適切なアドレスファミリーを決定する。local
はUnixのsocketを指定して、この場合にはhostは無視される。ipv4
とipv6
はそれぞれIPv4とIPv6の使用を指定する。
:use-external-socket use-external-socket
use-external-socketが非nil
なら割り当てられたsocketのかわりに呼び出し時にEmacsに渡されたsocketを使用する。これはEmacsサーバーのコードにおいてオンデマンドのsocketアクティベージョンを可能にするために使用される。Emacsがsocketを渡されていなければ、このオプションは暗黙に無視される。
:local local-address
サーバープロセスではlocal-addressはlistenするアドレスである。これはfamily、host、serviceをオーバーライドするので、これらを指定しないこともできる。
:remote remote-address
接続プロセスではremote-addressは接続先のアドレス。これはfamily、host、serviceをオーバーライドするので、これらを指定しないこともできる。
データグラムサーバーではremote-addressはリモートデータグラムアドレスの初期セッティングを指定する。
local-addressとremote-addressのフォーマットはアドレスファミリーに依存する:
[a b c
d
p]
で表され、それぞれ数値的なIPv4アドレスa.b.c.d、およびポート番号pに対応する。
[a b c d e
f g h
p]
で表され、それぞれ数値的なIPv6アドレスa:b:c:d:e:f:g:h、およびポート番号pに対応する。
(f
.
av)
で表される。ここでfはファミリー名、avはアドレスデータバイトごとに1つの要素を使用するソケットアドレスを指定するベクター。可搬性のあるコードでこのフォーマットを信頼してはならない。これは実装定義の定数、データサイズ、データ構造のアライメントに依存する可能性があるからだ。
:nowait bool
ストリーム接続にたいしてboolが非nil
なら、その接続の完了を待機せずにリターンする。接続の成功や失敗時には、Emacsは"open"
(成功時)、または"failed"
(失敗時)にマッチするような第2引数によりセンチネル関数を呼び出すだろう。デフォルトではwaitせずにblockするので、make-network-process
はその接続が成功または失敗するまでリターンしない。
非同期TLS接続をセットアップする場合には:tls-parameters
パラメーター(下記参照)も提供する必要があるだろう。
Emacsの機能に応じて:nowait
が非同期になる方法は異なる。非同期で実行可能(または不可能)な3つの要素はドメイン名解決、socketのセットアップ、および(TLS接続にいする)TLSネゴシエーション。
プロセスオブジェクトと相互作用する多くの関数(たとえばprocess-datagram-address
)は有用な値をリターンする以前に、少なくともsocketを所有することに依存する。これらの関数はsocketが望ましい状態に達するまでブロックされる。非同期socketと相互作用するための推奨方法はプロセスにセンチネルを配置して、その状態が‘"run"’になるまで相互作用を試みないことである。この方法ではこれらの関数はブロックされない。
:tls-parameters
TLS接続をオープンする際には最初の要素はTLSタイプ(gnutls-x509pki
かgnutls-anon
のいずれか)であり、残りの要素はgnutls-boot
が受容するキーワードリスト形式であること(このキーワードリストはgnutls-boot-parameters
関数で取得できる)。それからホストへの接続が完了後にTLS接続は確立される。
:stop stopped
stoppedが非nil
ならstopped(停止)の状態でネットワーク接続、またはサーバーを開始する。
:buffer buffer
プロセスバッファーとしてbufferを使用する。
:coding coding
このプロセスにたいするコーディングシステムとしてcodingを使用する。接続からのデータのデコードおよび接続への送信データのエンコードに異なるコーディングシステムを指定するには、codingにたいして(decoding
. encoding)
と指定する。
このキーワードをまったく指定しないかった場合のデフォルトは、そのデータからコーディングシステムを判断する。
:noquery query-flag
プロセスqueryフラグをquery-flagに初期化する。exit前の問い合わせを参照のこと。
:filter filter
プロセスフィルターをfilterに初期化する。
:filter-multibyte multibyte
multibyteが非nil
ならマルチバイト文字列、それ以外ならユニバイト文字列がプロセスフィルターに与えられるデフォルトはt
。
:sentinel sentinel
プロセスセンチネルをsentinelに初期化する。
:log log
サーバープロセスのlog関数をlogに初期化する。サーバーがクライアントからネットワーク接続をacceptするたびにそのlog関数が呼び出される。log関数に渡される引数はserver、connection、message。ここでserverはサーバープロセス、connectionはその接続にたいする新たなプロセス、messageは何が発生したかを説明する文字列。
:plist plist
プロセスplistをplistに初期化する。
実際の接続情報で修正されたオリジナルの引数リストはprocess-contact
を通じて利用できる。