Next: , Previous: , Up: プロセス   [Contents][Index]


39.14 ネットワーク接続

Emacs Lispプログラムは同一マシンまたは他のマシン上の別プロセスにたいしてストリーム(TCP)やデータグラム(UDP)のネットワーク接続(データグラムを参照)をオープンできます。ネットワーク接続はLispによりサブプロセスと同様に処理されて、プロセスオブジェクトとして表されます。しかし対話を行うそのプロセスはEmacsの子プロセスではなく、プロセスIDをもたず、それをkillしたりシグナルを送信することはできません。行うことができるのはデータの送信と受信だけです。delete-processは接続をクローズしますが、他方の端のプログラムをkillしません。そのプログラムは接続のクローズについて何を行うか決定しなければなりません。

ネットワークサーバーを作成することによりLispプログラムは接続をlistenできます。ネットワークサーバーもある種のプロセスオブジェクトとして表されますが、ネットワーク接続とは異なりネットワークサーバーがデータ自体を転送することは決してありません。接続リクエストを受信したときは、それにたいして作成した接続を表す新たなネットワーク接続を作成します(そのネットワーク接続はサーバーからプロセスplistを含む特定の情報を継承する)。その後でネットワークサーバーは更なる接続リクエストのlistenに戻ります。

ネットワーク接続とサーバーは、キーワード/引数のペアーで構成される引数リストでmake-network-processを呼び出すことにより作成されます。たとえば:server tはサーバープロセス、:type 'datagramはデータグラム接続を作成します。詳細は低レベルのネットワークアクセスを参照してください。以下で説明するopen-network-streamを使用することもできます。

異なるプロセスのタイプを区別するためにprocess-type関数はネットワーク接続とサーバーにはnetwork、シリアルポート接続はserial、pipe接続にはpipe、実際のサブプロセスにはrealをリターンします。

ネットワーク接続にたいしてprocess-status関数はopenclosedconnectstop、またはfailedをリターンします。ネットワークサーバーにたいしては状態は常にlistenになります。実際のサブプロセスにたいしてはstop以外の値はリターンされません。プロセスの情報を参照してください。

stop-processcontinue-processを呼び出すことにより、ネットワークプロセスの処理の停止と再開が可能です。サーバープロセスにたいする停止は新たな接続の受け付けないことを意味します(サーバー再開時は5つまでの接続リクエストがキューされる。これがOSによる制限でなければこの制限は増やすことができる。make-network-processmake-network-process:serverを参照)。ネットワークストリーム接続にたいしては、停止は入力の処理を行わないことを意味します(到着するすべての入力は接続の再開まで待つ)。データグラム接続にたいしては、いくらかのパケットはキューされますが入力は失われるかもしれません。ネットワーク接続またはサーバーが停止しているかどうかを判断するために、関数process-commandを使用できます。これが非nilなら停止しています。

ビルトインのGnuTLSトランスポート層セキュリティーライブラリーを使用することにより、Emacsは暗号化されたネットワーク接続を作成できます。the GnuTLS project pageを参照してください。これにはシステムにインストール済みの、gnutls-cliのようなヘルパーユーティリティーが必要です。GnuTLSサポートつきでEmacsをコンパイルした場合には関数gnutls-available-pが定義されて非nilをリターンします。詳細はOverview in The Emacs-GnuTLS manualを参照してください。open-network-stream関数は何であれ利用可能なサポートを使用して、暗号化接続作成の詳細を透過的に処理できます。

Function: open-network-stream name buffer host service &rest parameters

この関数はオプションで暗号つきでTCP接続をオープンして、その接続を表すプロセスオブジェクトをリターンする。

name引数はプロセスオブジェクトの名前を指定する。これは必要に応じて一意になるよう変更される。

buffer引数はその接続に関連付けるバッファー。その接続からの出力は出力を処理する独自のフィルター関数を指定していない場合には、buffernilならその接続はバッファーに関連付けられない。

引数hostserviceは接続先を指定する。hostはホスト名(文字列)、serviceは定義済みのネットワークサービス名(文字列)、またはポート番号(80のような整数か"80"のような整数文字列)。

残りの引数parametersは主に暗号化された接続に関連するキーワード/引数のペアー:

:nowait boolean

nilなら非同期接続を試みる。

:coding coding

これはcoding-system-for-readcoding-system-for-writeのバインディングより優先してネットワークプロセスが使用するコーディングシステムをセットするために使用する。詳細はmake-network-processを参照のこと。

:type type

接続のタイプ。オプションは以下のとおり:

plain

通常の暗号化されていない接続。

tls
ssl

TLS (Transport Layer Security)接続。

nil
network

plain接続を開始してパラメーター‘:success’と‘:capability-command’が与えられたら、STARTTLSを通じて暗号化接続への更新を試みる。これが失敗したら暗号化されていない接続のまま留まる。

starttls

nilと同様だがSTARTTLSが失敗したらその接続を切断する。

shell

shell接続。

:always-query-capabilities boolean

nilなら、たとえ‘plain’な接続を行っているときでも常にサーバーの能力を問い合わせる。

:capability-command capability-command

ホストの能力を問い合わせるためのコマンド。文字列(そのままサーバーに送信される)、または関数(接続時のサーバーからの"greeting"を単一のパラメーターでとして呼び出されて文字列をリターンすること)のいずれか。

:end-of-command regexp
:end-of-capability regexp

コマンドの終端、またはコマンドcapability-commandの終端にマッチする正規表現。前者は後者のデフォルト。

:starttls-function function

単一の引数(capability-commandにたいする応答)をとりnil、またはサポートされていればSTARTTLSをアクティブにするコマンドをリターンする関数。

:success regexp

成功したSTARTTLSネゴシェーションにマッチする正規表現。

:use-starttls-if-possible boolean

nilなら、たとえEmacsがビルトインのTLSサポートをもっていなくても、日和見的(opportunistic)にSTARTTLSアップグレードを行う。

:warn-unless-encrypted boolean

nil、かつ:return-valueも非nilなら、接続が暗号化されていない場合にはEmacsは警告するだろう。これはほとんどのユーザーがネットワークトラフィックが暗号化されているこを期待するであろうIMAPやその類のプロトコルにたいして有用。

:client-certificate list-or-t

証明書(certificate)のキーと、証明書のファイル自身を命名する(key-file cert-file)という形式のリスト、またはこの情報にたいしてauth-sourceを尋ねることを意味するtのいずれか(auth-source in Emacs auth-source Libraryを参照)。TLSSTARTTLSにたいしてのみ使用される。:client-certificateを未指定時に、自動的なauth-sourceの問い合わせを有効にするには、network-stream-use-client-certificatesをtにカスタマイズすればよい。

:return-list cons-or-nil

この関数のリターン値。省略またはnilならプロセスオブジェクトをリターンする。それ以外なら(process-object . plist)という形式のコンスセルをリターンする。ここでplistは以下のキーワード:

:greeting string-or-nil

nilならホストからリターンされたgreeting(挨拶)文字列。

:capabilities string-or-nil

nilならホストの能力(capability)文字列。

:type symbol

接続タイプであり、‘plain’か‘tls’のいずれか。

:shell-command string-or-nil

接続typeshellなら、このパラメーターは接続の作成のために実行されるフォーマット仕様文字列として解釈される。利用可能な仕様はホスト名の‘%s’とポート番号の‘%p’。たとえばプレーン接続を作成する前にまず‘gateway’にsshで接続したければ、このパラメーターは‘ssh gateway nc %s %p’のようになるかもしれない。