6.94. kink/socket/TCP_SERVER¶
TCP/IP、またはUnixドメインソケットのリスニングソケットを提供する。
例
次のプログラムはTCP/IPのサーバとクライアントを立ち上げる。サーバはソケットオプションSO_REUSEADDRとSO_RCVBUFを設定する。クライアントはバイト列 [1, 2, 3] をサーバに送る。
:TCP.require_from('kink/socket/')
:TCP_SERVER.require_from('kink/socket/')
:IP.require_from('kink/socket/')
:IP_PORT.require_from('kink/socket/')
:THREAD.require_from('kink/thread/')
:BIN.require_from('kink/')
:CONTROL.require_from('kink/')
:spawn_client <- {(:Server_addr)
THREAD.spawn_io{
CONTROL.with_finally{(:finally)
:Tcp = TCP.open
finally{ Tcp.close }
Tcp.connect(Server_addr)
:Out = Tcp.output
finally{ Out.close }
Out.write(BIN.of(1 2 3))
}
}
}
CONTROL.with_finally{(:finally)
:Server = TCP_SERVER.open
finally{ Server.close }
Server.so_reuseaddr <- true
Server.so_rcvbuf <- 1024
stdout.print_line(Server.so_reuseaddr.load.repr) # => true
stdout.print_line(Server.so_rcvbuf.load.repr) # => 1152
Server.bind_listen(IP_PORT.new(IP.for_hostname('::1') 0))
:Server_addr = Server.local_address
spawn_client(Server_addr)
:Tcp = Server.accept
finally{ Tcp.close }
:In = Tcp.input
finally{ In.close }
:Bin = In.read_all
stdout.print_line(Bin.repr) # => (bin 0x01 0x02 0x03)
}
6.94.1. tcp_server型¶
tcp_serverは、TCP/IP、またはストリームベースのUnix Domain Socketのリスニングソケットである。
6.94.1.1. Serv.bind_listen(Local ...[$config_fun={}])¶
bind_listenはローカルアドレスをリスニングソケットにひもづけ、ソケットを接続待ちモードにする。
コンフィグメソッド:
• C.backlog(Backlog): default = ランタイムのデフォルト
• C.on_success($success): default = {}
• C.on_error($error): default = {(:Exc) Exc.raise }
ソケットが接続待ちモードになった場合、bind_listenは引数なしで$successを末尾呼び出しする。
IOエラーが起きた場合、bind_listenは、exceptionを引数として$errorを末尾呼び出しする。
Backlogは、成立したがacceptされていない接続の最大数について、希望する値として使われる。
事前条件
Localは、socket_addressであり、そのプロトコルファミリがソケットに合致しなければならない。
Backlogは正の整数のnum値でなければならない。
$successはサンクでなければならない。
$errorはexceptionを引数に取る関数でなければならない。
6.94.1.2. Serv.accept(...[$config={}])¶
acceptメソッドはひとつの着信接続を受け入れる。
コンフィグメソッド:
• C.on_success($success): default = VAL.identity
• C.on_error($error): default = {(:Exc) Exc.raise }
• C.on_cancelled($cancelled): default = 例外を投げる関数
acceptメソッドは、接続が成立するか、IOエラーが起きるか、キャンセルされるまで待つ。
接続が成立した場合、acceptは、コネクティングソケットのtcp値を引数として$successを末尾呼び出しする。
IOエラーが起きた場合、acceptは、exceptionを引数として$errorを末尾呼び出しする。
キャンセルされた場合、acceptは引数なしで$cancelledを末尾呼び出しする
事前条件
ソケットは接続待ちモードでなければならない。
$successはtcpを引数に取る関数でなければならない。
$errorはexceptionを引数に取る関数でなければならない。
$cancelledはサンクでなければならない。
6.94.1.3. Serv.cancel_accept¶
cancel_acceptは、このリスニングソケットに対する、現在の、または次回のaccept操作をキャンセルする。
他のスレッドがaccept操作でブロックされていない場合、次回のacceptがキャンセルされる。
ひとつのスレッドがaccept操作でブロックされている場合、そのacceptの呼び出しがキャンセルされる。
複数のスレッドがaccept操作でブロックされている場合、そのうちのひとつがキャンセルされる。
6.94.1.4. Serv.close(...[$config={}])¶
closeはリスニングソケットを閉じる。
コンフィグメソッド:
• C.on_success($success): default = {}
• C.on_error($error): default = {(:Exc) Exc.raise }
ソケットが成功裏に閉じられた場合、closeは引数なしで$successを末尾呼び出しする。
IOエラーが起きた場合、closeはexceptionを引数として$errorを末尾呼び出しする。
事前条件
$successはサンクでなければならない。
$errorはexceptionを引数に取る関数でなければならない。
6.94.1.5. Serv.local_address(...[$config={}])¶
local_addressは、リスニングソケットのローカルアドレスのsocket_addressを取得する
コンフィグメソッド:
• C.on_success($success): default = VAL.identity
• C.on_error($error): default = {(:Exc) Exc.raise }
ローカルアドレスがある場合、local_addressはsocket_addressを引数として$successを末尾呼び出しする。
IOエラーが起きた場合、local_addressはexceptionを引数として$errorを末尾呼び出しする。
事前条件
$successはsocket_addressを引数に取る関数でなければならない。
$errorはexceptionを引数に取る関数でなければならない。
6.94.1.6. Serv.so_reuseaddr¶
so_reuseaddrは、SO_REUSEADDRオプションのbool値のrefを戻す。
For usage of socket options, see the example program at the beginning of this module.
事前条件
プロトコルファミリはipv4かipv6でなければならない。
6.94.1.7. Serv.so_rcvbuf¶
so_rcvbufは、SO_RCVBUFオプションの非負の整数のnum値のrefを戻す。
For usage of socket options, see the example program at the beginning of this module.
6.94.2. TCP_SERVER.open(...[Protocol_family=PROTOCOL_FAMILY.ipv6 $config={}])¶
openメソッドは新しくリスニングソケットを作る。
コンフィグメソッド:
• C.on_success($success): default = VAL.identity
• C.on_error($error): default = {(:Exc) Exc.raise }
• C.on_unsupported($unsupported): default = exceptionを引数として$errorを末尾呼び出しする関数
リスニングソケットが作られた場合、openは、リスニングソケットを表すtcp_serverを引数として$successを末尾呼び出しする。
IOエラーが起きた場合、openはexceptionを引数として$errorを末尾呼び出しする。
ランタイムがProtocol_familyをサポートしない場合、openは$unsupportedを引数なしで末尾呼び出しする。
事前条件
Protocol_familyはprotocol_family値でなければならない。
$successはtcp_serverを引数に取る関数でなければならない。
$errorはexceptionを引数に取る関数でなければならない。
6.94.3. TCP_SERVER.is?(Val)¶
is?はValがtcp_server値であるかどうかを戻す。