gauche.connection
- コネクションフレームワーク ¶コネクションは双方向コミュニケーションチャネルを抽象化するクラスです。 実際のデータI/OはSchemeポートを使いますが、 コネクションはコミュニケーションに利用できるポートを得るのに使えるほか、 通信相手の名前を得たり、通信をシャットダウンする操作を提供します。
例えば<socket>
クラスはコネクションフレームワークを実装しています
(gauche.net
- ネットワーキング参照)。
ソケットをラップしてTLS通信を提供する<tls>
クラスも、
コネクションフレームワークを実装しています。
すると、生のソケットでもTLSソケットでも同じように使えるクライアントコードを書くことができます。
また、外部プロセスとの通信をコネクションとして抽象化することもできます
(Process connection参照)。
コネクションのエンドポイント(自分自身をself、相手をpeerと呼びます)は
それぞれエンドポイントを同定するアドレスを持ちます。
このフレームワークではアドレスの具体的な型は指定しません。ただ、
アドレスはconnection-address-name
に渡せば
わかりやすい文字列表現を得られるので、ロギングやモニタリングに使えます。
コネクションの具体クラスはアドレスをどう表現するかを選べます。
例えば<socket>
は<sockaddr>
をアドレスとして使います。
具体クラスは以下のメソッドを実装しなければなりません。
connection-self-address (c <connection>) connection-peer-address (c <connection>) connection-input-port (c <connection>) connection-output-port (c <connection>) connection-shutdown (c <connection>) how connection-close (c <connection>) connection-address-name obj ; optional
今のところ、このフレームワークはコネクションを作るジェネリックな方法は提供しません。 それは具体的な実装によって大きく異なるからです。 各具体クラスは、新たなコネクションを返す独自の手続きを提供しなければなりません。
{gauche.connection
}
connectionのエンドポイントの自分自身と相手のアドレスをそれぞれ返します。
ソケットと<tls>
オブジェクトでは、アドレスは<sockaddr>
のインスタンスです。
プロセスコネクションでは、プロセスを記述する文字列です。
connectionが接続されていなければ#f
が返されるかもしれません。
#f
でない返り値は、connection-address-name
に渡すことができます。
今のところ、アドレスはロギング用途にのみ使われています。 しかし、将来、“connect” 操作もこのフレームワークで提供することになるかもしれまえsん。 新たな具体クラスを実装する場合は、可能ならコネクションを作るために渡せるオブジェクトを アドレスにするのが良いでしょう。
{gauche.connection
}
このメソッドは、connection-self-address
やconnection-peer-address
から返されるアドレスオブジェクトを取り、その文字列表現を返します。ソケットアドレスの場合は、
読みやすい文字列表示が返されます。デフォルトメソッドはアドレスオブジェクトの
display表示になります。具体クラスはより読みやすい表記を返すメソッドを実装すべきです。
{gauche.connection
}
コネクションの入力ポートと出力ポートをそれぞれ返します。
出力ポートに書き込むことでデータを送信することができ、
また入力ポートから読み込むことで受信したデータを読み出せます。
コネクションがまだ接続されていなかったり、既にクローズしている場合は これらのメソッドの戻り値は不定です。
{gauche.connection
}
コネクションを遮断します。送受信を同時に遮断することも、
送信か受信どちらかのみを遮断することもできます。
遮断は、通信相手に通信の終了を通知する操作です。 通常、送信を遮断すると、通信相手側では受信データとしてEOFが返されます。 遮断したコネクションに対応するポートは閉じられ、以降の操作に使うことはきません。
コネクションをクローズするだけでは、必ずしも通信が遮断されるとは限らないことに 注意してください。例えばコネクションを作った後でプロセスがforkした場合、 一方のプロセスがコネクションを閉じてももう一方のプロセスのコネクションは遮断されません。
how引数は次のいずれかのシンボルです。
read
読み込み(受信)チャネルを遮断します。
write
書き込み(送信)チャネルを遮断します。
both
送受信両方のチャネルを遮断します。
省略時はboth
と同じです。
既に遮断されたチャネルを再び遮断しても何も起きません。
註: 具体的な実装によっては、送信・受信チャネルを独立して遮断できないかもしれません。 その場合は、how引数に関わらず送受信両方が遮断されます。
how引数が省略された場合はデフォルトメソッドがhowにboth
を
指定したメソッドを呼ぶので、具体クラスは2引数のメソッドのみを定義すれば良いです。
{gauche.connection
}
コネクションをクローズします。これはローカルのコネクションオブジェクトを破棄して
リソースを開放します。コネクションそのものが遮断されるわけではないことに注意してください。
例えばコネクション接続後にプロセスがforkし、親プロセスがコネクションをクローズしたとしても、
子プロセスは通信を続けることができます。
このコネクションがローカル側の唯一のエンドポイントである場合は、 こちらがクローズした後に相手が通信しようとすると、相手側でエラーになるでしょう。
コネクションの遮断についてはconnection-shutdown
を参照してください。