Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
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

AltStyle によって変換されたページ (->オリジナル) /