std:net リファレンス
import net := "std:net" で取得する TCP クライアントモジュール。connect / connect_tls で Conn ハンドルを得て read / read_exact / write / close する。
Conn
ExactlyOnce(Conn)
TCP 接続のハンドル。ExactlyOnce の多重度型で、close が Consuming メソッドである。
閉じ忘れはソケットの漏れなので消費義務を課す。read / write は受け手を借用する。
>>> import net := "std:net" >>> c := net.connect("example.com", 80)!.unwrap! >>> c.close()!
connect
connect(host, port)
connect: { String, Int | Effect(Future(Result(Conn)), Net) }
平文 TCP で host:port へ接続し Conn ハンドルを得る。
効果ハンドラーの操作である。handle の操作スロットに connect と書いて横取りできる(language-spec.md §17.9)。
>>> c := net.connect("example.com", 80)! >>> c.close()!
connect_tls
connect_tls(host, port)
connect_tls: { String, Int | Effect(Future(Result(Conn)), Net) }
TLS で host:port へ接続する (システムルート CA・ホスト名検証)。
効果ハンドラーの操作である。handle の操作スロットに connect_tls と書いて横取りできる(language-spec.md §17.9)。
>>> c := net.connect_tls("example.com", 443)! >>> c.close()!
Conn メソッド
close
c.close() close: Consuming({ Effect(Future(Result(Unit)), Net) })
切断して封印する。以降のメソッド呼び出しは Error。
効果ハンドラーの操作である。handle の操作スロットに close と書いて横取りできる(language-spec.md §17.9)。
>>> c := net.connect("example.com", 80)! >>> c.close()!
read
c.read(n) read: { Int | Effect(Future(Result(Bytes)), Net) }
最大 n bytes 読む。Ok の空 Bytes は EOF (相手が閉じた)。
効果ハンドラーの操作である。handle の操作スロットに read と書いて横取りできる(language-spec.md §17.9)。
>>> c := net.connect("example.com", 80)! >>> data := c.read(1024)! >>> print data
read_exact
c.read_exact(n) read_exact: { Int | Effect(Future(Result(Bytes)), Net) }
ちょうど n bytes 読む。揃う前に EOF なら Err(eof)。
効果ハンドラーの操作である。handle の操作スロットに read_exact と書いて横取りできる(language-spec.md §17.9)。
>>> c := net.connect("example.com", 80)! >>> head := c.read_exact(4)! >>> print head
set_timeout
c.set_timeout(ms) set_timeout: { Int | Effect(Unit, Mut) }
以降の read / write の期限をミリ秒で設定する (0 で解除)。同期・即値 ()。
効果ハンドラーの操作である。handle の操作スロットに set_timeout と書いて横取りできる(language-spec.md §17.9)。
>>> c := net.connect("example.com", 80)! >>> c.set_timeout(5000)
write
c.write(bytes) write: { Bytes | Effect(Future(Result(Unit)), Net) }
bytes を全量書く。
効果ハンドラーの操作である。handle の操作スロットに write と書いて横取りできる(language-spec.md §17.9)。
>>> c := net.connect("example.com", 80)! >>> payload := fs.read_bytes("req.bin")! >>> c.write(payload)!