upanishad の master - slave の部分のテストが透らず困っている。
仕方なく socket を勉強することに。
とりあえず SBCLのマニュアルを眺めて見ることにした。
英語は Google先生を元に文章が短かくなるように適当に編集した。
それでは開始。
sb-bsd-sockets
モジュールは、SBCLのためのBSDソケットAPIを提供します。
CのBSDソケットAPIとPerlのGraham BarrのIO::Socket
クラスを参考にしています。
ソケットはCLOSEオブジェクトとして表現されています。
APIの命名規則はBSD名とLispスタイルのバランスを取っています。
ほとんどの関数はBSDソケットAPIでモデル化されています。
BSDソケットは、さまざまなシステムで移植可能(少なくともUNIX標準では "移植可能")で広くサポートされており、文書化されています。
Common Lispのより有用な機能のいくつかを簡単に利用したアプローチにはいくつかの違いがあります:
- 通常、C APIが-1を返してerrnoを設定する場合、sb-bsd-socketsはエラーを通知します。 すべてのエラーはsb-bsd-sockets:socket-conditionのサブクラスであり、一般的にはerrno値の可能性のあるエラーに対応します。
- C APIが参照渡しの値を使用する多くの場所で、複数の戻り値を使用します。
- 引数の長さをすでに知っているので、関数に明示的な長さ引数を渡すことをしばしば避けることができます。
- IPアドレスとポートは、「network-endian integers」よりも少し優しい方法で表現されます。
type |
symbol |
args |
Class |
socket |
[sb-bsd-sockets] |
Generic Function |
socket-bind |
[sb-bsd-sockets] socket &rest address |
Generic Function |
socket-accept |
[sb-bsd-sockets] socket |
Generic Function |
socket-connect |
[sb-bsd-sockets] socket &rest address |
Generic Function |
socket-peername |
[sb-bsd-sockets] socket |
Generic Function |
socket-name |
[sb-bsd-sockets] socket |
Generic Function |
socket-receive |
[sb-bsd-sockets] socket buffer length &key oob peek waitall dontwait element-type |
Generic Function |
socket-send |
[sb-bsd-sockets] socket buffer length &key address external-format oob eor dontroute dontwait nosignal confirm more |
Generic Function |
socket-listen |
[sb-bsd-sockets] socket backlog |
Generic Function |
socket-open-p |
[sb-bsd-sockets] socket |
Generic Function |
socket-close |
[sb-bsd-sockets] socket &key abort |
Generic Function |
socket-shutdown |
[sb-bsd-sockets] socket &key direction |
Generic Function |
socket-make-stream |
[sb-bsd-sockets] socket &key input output element-type external-format buffering timeout auto-close serve-events |
Method |
socket-make-stream |
[sb-bsd-sockets] (socket socket) &key input output (element-type (quote character)) (buffering full) (external-format default) timeout auto-close serve-events |
Function |
socket-error |
[sb-bsd-sockets] where &optional errno |
Generic Function |
non-blocking-mode |
[sb-bsd-sockets] socket |
ソケットオプションのサブセットは、一般的なフレームワークを使用してサポートされています。
これにより、必要に応じて簡単に追加することができます。
詳細については、SYS:CONTRIB;SB-BSD-SOCKETS:SOCKOPT.LISP
を参照してください。
Cからの名前マッピングはかなり簡単です。
SO_RCVLOWAT
は sockopt-receive-low-water
と (setf sockopt-receive-low-water)
になります。
type |
symbol |
args |
Function |
sockopt-reuse-address |
[sb-bsd-sockets] socket |
Function |
sockopt-keep-alive |
[sb-bsd-sockets] socket |
Function |
sockopt-oob-inline |
[sb-bsd-sockets] socket |
Function |
sockopt-bsd-compatible |
[sb-bsd-sockets] socket |
Function |
sockopt-pass-credentials |
[sb-bsd-sockets] socket |
Function |
sockopt-debug |
[sb-bsd-sockets] socket |
Function |
sockopt-dont-route |
[sb-bsd-sockets] socket |
Function |
sockopt-broadcast |
[sb-bsd-sockets] socket |
Function |
sockopt-tcp-nodelay |
[sb-bsd-sockets] socket |
あなたが知っている、愛しているTCPソケットとUDPソケット。 いくつかの表現の問題:
- IPv4インターネットアドレスは(符号なしバイト8)のベクトルで表されます。
#(127 0 0 1)
。
ポートは6010(整数)だけです。
このパッケージのユーザーからは、ネットワーク注文データとホスト注文データの間の変換は必要ありません。
- IPv6インターネットアドレスは、16(符号なしバイト8)のベクトルで表されます。
#(0 0 0 0 0 0 0 0 0 0 0 0 0 0 1)
。
ポートは単なる整数です。
IPv4アドレスに関しては、このパッケージのユーザからネットワーク注文データとホスト注文データの間の変換は必要ありません。
- ソケットアドレスはaddressとportの2つの値で表されます。
例えば、(socket-connect socket#(192 168 1 1)80)for IPv4と (socket-connect socket#(0 0 0 0 0 0 0 0) 0 0 0 0 0 0 0 1)80)
IPv6のために。
type |
symbol |
args |
Class |
inet-socket |
[sb-bsd-sockets] |
Class |
inet6-socket |
[sb-bsd-sockets] |
Function |
make-inet-address |
[sb-bsd-sockets] dotted-quads |
Function |
make-inet6-address |
[sb-bsd-sockets] colon-separated-integers |
Function |
get-protocol-by-name |
[sb-bsd-sockets] name |
ローカルドメイン(AF_LOCAL)ソケットはUnixドメインソケットとも呼ばれますが、おそらく他のシステムでも利用可能であるという基準でPOSIXによって名前が変更されました。
ローカルソケットアドレスは文字列であり、ローカルファイルシステムにノードを作成するために使用されます。
これはもちろん、ネットワーク上で使用することはできません。
type |
symbol |
args |
Class |
local-socket |
[sb-bsd-sockets] |
現在、ネームサービスは getaddrinfo(3)
とgethostinfo(3)
、またはgethostbyname(3)
とgethostbyaddr(3)
を呼び出すことで実装されています。
名前解決プロセス(DNSやhostsファイルが参照に使用されているかどうかなど)の正確な詳細は、プラットフォームによって異なります。
type |
symbol |
args |
Class |
host-ent |
[sb-bsd-sockets] |
Function |
get-host-by-name |
[sb-bsd-sockets] node |
Function |
get-host-by-address |
[sb-bsd-sockets] address |
Generic Function |
host-ent-address |
[sb-bsd-sockets] host-ent |
おわり
なんかなんとなく全体は見えたような気がする。
C のソケットの使い方を理解すれば良さそう.
パッケージは sb-bsd-sockets
みたいなので次回はそれを俯瞰してみるか。