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値であるかどうかを戻す。