From: "Toshihiko SHIMOKAWA / 下川俊彦" Date: 1999-07-12T11:53:12+09:00 Subject: [ruby-dev:7300] resolver を呼ばない UDPsocket#recvfrom ----Next_Part(Mon_Jul_12_11:52:02_1999_809)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit あんまり ruby-dev な話でも無いのですが、ちょっとした機能拡張の提案なので、 こっちへ。妙な提案だから ruby-list では恥ずかしいというのもあります:-) UDPsocket#recvfrom って、帰り値の二番目の要素として [host, port] を返し ますよね。ここで host は getnameinfo を使って、アドレスから逆引きしてホ スト名になって帰ってきます。この、「アドレスから逆引き」をしない recvfrom が欲しいという要望です。 API 的にはどうするのが綺麗かよく分かりませんが、recvfrom に、真偽値な第 三引数を付けて頂くとかどうでしょうか? 例えば何らかの理由で DNS を使えない環境で UDPsocket #recvfrom を使ったス クリプトを動かしたいと思った場合、現在の仕様だと resolver のタイムアウト を待ったりしてしまうため、あまり嬉しくありません。 そもそも DNS が使えない環境なんてのが、問題であるという指摘もあるかと思 います。実は ruby で DNS 書いてたりするんです。このため、ruby スクリプト からは DNS が引けないんです。 現在は、socket.c に添付の patch をあてて凌いでいます。この patch だと、 あらゆる socket に関して、ホスト名への逆引きを行ってくれないため、副作用 大きすぎです。 TCPsocket#recvfrom も、同様の機能を持っていますので、直交性を考えると、 こちらにも同様の機能を付けて頂いた方が綺麗かも知れませんが、僕的な需要は ありません。 あまり一般的な要望では無いのは承知していますが、採用されると嬉しいなぁ。 -- としちゃん // toshi@tea.forus.or.jp, toshi@csce.kyushu-u.ac.jp ----Next_Part(Mon_Jul_12_11:52:02_1999_809)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=socket.c.diff --- socket.c-dist Thu Jun 24 13:24:06 1999 +++ socket.c Mon Jul 12 11:30:45 1999 @@ -552,17 +552,23 @@ family = 0; break; } +#define DONT_RESOLV 1 +#if !defined(DONT_RESOLV) error = getnameinfo(sockaddr, SA_LEN(sockaddr), hbuf, sizeof(hbuf), NULL, 0, 0); if (error) { rb_raise(rb_eSocket, "%s", gai_strerror(error)); } +#endif addr1 = rb_str_new2(hbuf); error = getnameinfo(sockaddr, SA_LEN(sockaddr), hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), NI_NUMERICHOST | NI_NUMERICSERV); if (error) { rb_raise(rb_eSocket, "%s", gai_strerror(error)); } +#if defined(DONT_RESOLV) + addr1 = rb_str_new2(hbuf); +#endif addr2 = rb_str_new2(hbuf); port = INT2FIX(atoi(pbuf)); ary = rb_ary_new3(4, family, port, addr1, addr2); ----Next_Part(Mon_Jul_12_11:52:02_1999_809)----