-
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 オブジェクトを作るしかないだろう。