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"番ポートに対して、
を行います。
(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への接続要求があるまでブロックします。接続要求があると新しい通信用の
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よりデータを受信し、新しく作成した
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>
ホスト名を返します。