Next: , Up: 低レベルのネットワークアクセス   [Contents][Index]


39.17.1 make-network-process

ネットワーク接続やネットワークサーバーを作成する基本的な関数はmake-network-processです。これは与えられた引数に応じて、これらの仕事のいずれかを行うことができます。

Function: make-network-process &rest args

この関数はネットワーク接続やサーバーを作成して、それを表すプロセスオブジェクトをリターンする。引数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を使用するが、ipv6familyを指定してこれをオーバーライドできる。すべてのインターフェースを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は与えられたhostserviceにたいして自動的に適切なアドレスファミリーを決定する。localはUnixのsocketを指定して、この場合にはhostは無視される。ipv4ipv6はそれぞれ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するアドレスである。これはfamilyhostserviceをオーバーライドするので、これらを指定しないこともできる。

:remote remote-address

接続プロセスではremote-addressは接続先のアドレス。これはfamilyhostserviceをオーバーライドするので、これらを指定しないこともできる。

データグラムサーバーではremote-addressはリモートデータグラムアドレスの初期セッティングを指定する。

local-addressremote-addressのフォーマットはアドレスファミリーに依存する:

  • - IPv4アドレスは4つの8ビット整数と1つの16ビット整数からなる5要素のベクター[a b c d p]で表され、それぞれ数値的なIPv4アドレスa.b.c.d、およびポート番号pに対応する。
  • - IPv6アドレスは9要素の16ビット整数ベクター[a b c d e f g h p]で表され、それぞれ数値的なIPv6アドレスa:b:c:d:e:f:g:h、およびポート番号pに対応する。
  • - ローカルアドレスはローカルアドレススペース内でアドレスを指定する文字列として表される。
  • - 未サポートファミリー(unsupported family)のアドレスはコンスセル(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-x509pkignutls-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関数に渡される引数はserverconnectionmessage。ここでserverはサーバープロセス、connectionはその接続にたいする新たなプロセス、messageは何が発生したかを説明する文字列。

:plist plist

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

実際の接続情報で修正されたオリジナルの引数リストはprocess-contactを通じて利用できる。