読者です 読者をやめる 読者になる 読者になる

ほんとのこと知りたいだけなのに。

夏休みはもうおわり。

SBCL のマニュアル 14 Networking を俯瞰してみる。

Common Lisp SBCL Socket

upanishad の master - slave の部分のテストが透らず困っている。

仕方なく socket を勉強することに。

とりあえず SBCLのマニュアルを眺めて見ることにした。
英語は Google先生を元に文章が短かくなるように適当に編集した。

それでは開始。

14 Networking

sb-bsd-sockets モジュールは、SBCLのためのBSDソケットAPIを提供します。

CのBSDソケットAPIとPerlのGraham BarrのIO::Socketクラスを参考にしています。

ソケットはCLOSEオブジェクトとして表現されています。

APIの命名規則はBSD名とLispスタイルのバランスを取っています。

14.1 Sockets Overview

ほとんどの関数は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」よりも少し優しい方法で表現されます。

14.2 General Sockets

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

14.3 Socket Options

ソケットオプションのサブセットは、一般的なフレームワークを使用してサポートされています。
これにより、必要に応じて簡単に追加することができます。
詳細については、SYS:CONTRIB;SB-BSD-SOCKETS:SOCKOPT.LISPを参照してください。

Cからの名前マッピングはかなり簡単です。
SO_RCVLOWATsockopt-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

14.4 INET Domain Sockets

あなたが知っている、愛している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

14.5 Local (Unix) Domain Sockets

ローカルドメイン(AF_LOCAL)ソケットはUnixドメインソケットとも呼ばれますが、おそらく他のシステムでも利用可能であるという基準でPOSIXによって名前が変更されました。

ローカルソケットアドレスは文字列であり、ローカルファイルシステムにノードを作成するために使用されます。
これはもちろん、ネットワーク上で使用することはできません。

type symbol args
Class local-socket [sb-bsd-sockets]

14.6 Name Service

現在、ネームサービスは 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 みたいなので次回はそれを俯瞰してみるか。