-
Notifications
You must be signed in to change notification settings - Fork 4
Socket
- 通常の Ruby オブジェクトにした。@sockaddr を String として持つ。
- getaddrinfo(3) は socktype を適切に設定せずに service を指定するとエラーを上げる場合がある(NetBSD3)。
.for_fd がある。fd から各子クラスのインスタンスを生成する。self->class に bless する感じか。...つまり子クラスでは fd 以外の何かを持ってはいけないということになるか?
#initialize
: @do_not_reverse_lookup = BasicSocket.do_not_reverse_lookup する。
#recv_nonblock
: 一時的にノンブロッキングに設定する。戻す必要あり。
ブロッキングの設定は外部APIには出ていない。attribute として持つ必要すらない。
IPsocket#recvfrom
と Socket#recvfrom
の実装を共通化するため #_recvfrom
を作った。
返り値は [ data, sockaddr ]]
。
#addr
#peeraddr
.getaddress
は Addrinfo に依存している。
#recvfrom
は BasicSocket の #_recvfrom
を使った。
.gethostbyname
: なぜここにあるんだろう?
-
#send
: 2,3 引数の場合はBasicSocket#send
で良い。
.getaddrinfo
: Addrinfo.getaddrinfo の方がまっとうで情報量も多いのでそちらを primitive にする。返り値の第2要素の「ホスト名」はアドレスが返ってきた。。。
.getnameinfo
: これはベタに書かざるを得ないか。
.ip_address_list
: getifaddrs だろう。他になければこれで。
.new
: socket(2) のラッパーはこれで良いか。fd = socket(2); super(fd, "rw"); て感じか。
.tcp
: やることは TCPSocket.new とまったく同じだが、返すものが Socket のインスタンスだというところだけ違う(!)。
.unix
: socket して connect(AF_UNIX) する。ruby で書けそう。
#accept
: accept(2) しつつ、sockaddr を Addrinfo のかたちで返す。
#recvfrom
は BasicSocket の #_recvfrom
を使う。
#sysaccept
:
IPSocket UnixSocket が #addr
を持つ。BasicSocket.getsockname を使いつつそれぞれ実装する。
- CRuby の Socket.sockaddr_un は sun_len をセットしない。mruby でも同様とする。
- 各クラスでの .for_fd はどう試したら良い?
- recvmsg/sendmsg は後回し。Socket::AncillaryData も。
- gethostbyname は後回し。そもそも obsolete な API なので実装したくない。
- mrb_str_new... が struct sockaddr にキャストできるポインタを返すことを仮定している。これをポータブルにやる方法はあるのか...?
- _lastai ハックをきれいにするには、getaddrinfo の戻りを格納するだけのために tt_data オブジェクトを作るしかないだろう。