Draft: ライブラリ (socket)

(socket)はリリース版にはまだ含まれていません。使用するにはsvn repositoryのtrunkをビルドしてください。

library: (socket)

ソケットへのインターフェイスを提供します。

procedure: make-client-socket

クライアントソケットを作成します。

synopsis:
  (make-client-socket node service . [ai-family ai-socktype ai-flag ai-protocol]) 
   => <client-socket>
arguments:
  node: <string>
  service: <string>
  ai-family: <int>
  ai-socktype: <int>
  ai-flag: <int>
  ai-protocol: <int>
defaults:
  ai-family: AF_INET
  ai-socktype: SOCK_STREAM
  ai-flag: AI_V4MAPPED | AI_ADDRCONFIG
  ai-protocol: 0

接続先のアドレスはgetaddrinfo(POSIX)により作成します。この時にai-family, ai-socktype, ai-flag, ai-protocolがhintsとして使用されます。

examples:
> (import (socket))
> (make-client-socket "www.w3c.org" "http")
#<client-socket tcp stream 128.30.52.45:80>

procedure: make-server-socket

サーバーソケットを作成します。

synopsis:
  (make-server-socket service . [ai-family ai-protocol]) => <server-socket>
arguments:
  service: <string>
  ai-family: <int>
  ai-protocol: <int>
defaults:
  ai-family: AF_INET
  ai-protocol: 0

接続を受けるアドレスはgetaddrinfo(POSIX)により作成します。この時にai-family, ai-protocol, SOCK_STREAM, AI_PASSIVEがhintsとして使用されます。

examples:
> (import (socket))
> (make-server-socket "6800")
#<server-socket tcp stream 0.0.0.0:6800>
AF_INET6の使用例 (Linux 2.6)
> (import (socket))
> (define server (make-server-socket "6802" AF_INET6))
> server
#<server-socket tcp stream [::]:6802>
> (make-client-socket "ip6-localhost" "6802" AF_INET6)
#<client-socket tcp stream [::1]:6802>
> (make-client-socket "ip6-localhost" "6802")
#<client-socket tcp stream 127.0.0.1:6802>

procedure: call-with-socket

synopsis:
  (call-with-socket socket proc) => values returned by proc
arguments:
  socket: <client-socket> or <server-socket>
  proc: <procedure>

call-with-portのsocket版です。socketの値を引数にしてprocを呼びます。procから制御が戻ればsocketに対してsocket-closeを呼び出し、procの返した値をフォーム全体の値として返します。もしも例外や大域脱出などでprocが制御を戻さない場合にはsocket-closeは呼ばれません。procは引数を一つ取る手続きでなければなりません。

procedure: socket-port

socketに対応付けされた新しい入出力ポートを作成します。

synopsis:
  (socket-port socket) => <binary-input/output-port>
arguments:
  socket: <client-socket> or <server-socket>

ポートはバイナリーモードでブロックバッファリングが行われます。同じsocketに対して何度でもポートを作成するこができます。次のプログラムは"localhost"の"6800"番ポートに対して、

  1. UTF-8エンコードされたテキストの"HELLO"を送信。
  2. ソケットの出力をシャットダウン。
  3. バイナリーデータを受信。

を行います。

(import (socket))
(call-with-socket (make-client-socket "localhost" "6800")
  (lambda (socket)
    (call-with-port 
      (transcoded-port (socket-port socket) (make-transcoder (utf-8-codec)))
      (lambda (port)
        (put-string port "HELLO")     ; *1
        (shutdown-output-port port))) ; *2
    (call-with-port 
      (socket-port socket)
      (lambda (port)
        (get-bytevector-all port)))))  ; *3

procedure: shutdown-output-port

ポートに対応付けされたソケットの出力をシャットダウンします。

synopsis:
  (shutdown-output-port port) => unspecified
arguments:
  port: <port>

portはソケットに対応付けされたポートでなければなりません。

procedure: socket?

オブジェクトがソケットであれば#t、そうでなければ#fを返します。

synopsis:
  (socket? obj) => boolean
arguments:
  obj: any

procedure: make-socket

低レベルのソケット作成手続きです。

synopsis:
  (make-socket node service ai-family ai-socktype ai-flag ai-protocol)
   => <client-socket> or <server-socket>
arguments:
  node: <string> or #f
  service: <string> or #f
  ai-family: <int>
  ai-socktype: <int>
  ai-flag: <int>
  ai-protocol: <int>

ソケットのアドレスはgetaddrinfo(POSIX)により決定します。この時にai-family, ai-socktype, ai-flag, ai-protocolがhintsとして使用されます。またnodeやserviceが#fの場合には対応するgetaddrinfoの引数にNULLをセットします。ai-flagにAI_PASSIVEが含まれていれば、そうでなければを返します。

procedure: socket-accept

synopsis:
  (socket-accept socket flags) => <client-socket>
arguments:
  socket: <server-socket>
  flags: <int>

socketへの接続要求があるまでブロックします。接続要求があると新しい通信用のを作成してこれを返します。flagsはCライブラリのaccept()にそのまま渡されます。

procedure: socket-send

synopsis:
  (socket-send socket buffer flags) => unspecified
arguments:
  socket: <client-socket>
  buffer: <bytevector>
  flags: <int>

bufferの中のデータをsocketに送信します。flagsはCライブラリのsend()にそのまま渡されます。

procedure: socket-recv

synopsis:
  (socket-send socket flags) => <bytevector>
arguments:
  socket: <client-socket>
  flags: <int>

socketよりデータを受信し、新しく作成したの中に格納してこれを返します。flagsはCライブラリのrecv()にそのまま渡されます。

procedure: socket-shutdown

synopsis:
  (socket-shutdown socket how) => unspecified
arguments:
  socket: <client-socket>
  how: 0, 1, or 2

howの値にしたがってsocketをシャットダウンします。howにはSHUT_RD(入力)SHUT_WR(出力)SHUT_RDWR(入出力)のいずれかを指定します。

procedure: socket-close

synopsis:
  (socket-close socket) => unspecified
arguments:
  socket: <client-socket> or <server-socket>

socketをクローズします

procedure: gethostname

synopsis:
  (gethostname) => <string>

ホスト名を返します。