Skip to content
Tomoyuki Sahara edited this page Oct 15, 2013 · 38 revisions

Addrinfo

  • 通常の Ruby オブジェクトにした。@sockaddr を String として持つ。
  • getaddrinfo(3) は socktype を適切に設定せずに service を指定するとエラーを上げる場合がある(NetBSD3)。

BasicSocket

.for_fd がある。fd から各子クラスのインスタンスを生成する。self->class に bless する感じか。...つまり子クラスでは fd 以外の何かを持ってはいけないということになるか?

#initialize : @do_not_reverse_lookup = BasicSocket.do_not_reverse_lookup する。

#recv_nonblock : 一時的にノンブロッキングに設定する。戻す必要あり。

ブロッキングの設定は外部APIには出ていない。attribute として持つ必要すらない。

IPsocket#recvfromSocket#recvfrom の実装を共通化するため #_recvfrom を作った。 返り値は [ data, sockaddr ]]

IPSocket

#addr #peeraddr .getaddress は Addrinfo に依存している。 #recvfrom は BasicSocket の #_recvfrom を使った。

TCPSocket

.gethostbyname : なぜここにあるんだろう?

UDPSocket

  • #send : 2,3 引数の場合は BasicSocket#send で良い。

Socket

.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 でも同様とする。

TODO

  • 各クラスでの .for_fd はどう試したら良い?
  • recvmsg/sendmsg は後回し。Socket::AncillaryData も。
  • gethostbyname は後回し。そもそも obsolete な API なので実装したくない。
  • mrb_str_new... が struct sockaddr にキャストできるポインタを返すことを仮定している。これをポータブルにやる方法はあるのか...?
  • _lastai ハックをきれいにするには、getaddrinfo の戻りを格納するだけのために tt_data オブジェクトを作るしかないだろう。
Clone this wiki locally