From: "5.5" <5.5@...> Date: 2009-12-19T22:45:57+09:00 Subject: [ruby-list:46666] TCPSocket#peeraddr に時間がかかる。 5.5 です。 Windows マシンから,LAN 内の固定 IP のマシンに FTP でファイル 転送しようとしたところ,異常に時間がかかりました。小さなファイ ル一つ送るのに数秒です。 Mac OS X 10.5 で同じようなことをやると,一瞬で終わります。 WIndows でも FTP ソフト(NextFTP)で転送すると一瞬で終わります。 原因を調べたところ,TCPSocket#peeraddr に時間がかかっているよう でした。 以下の実験をしました。 マシン A: Windows XP SP2(TCP/IP の設定はたぶんいじってない) ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mswin32] マシン B: ※詳細は忘れましたが,古い Sun OS です。 IP アドレスは 192.168.1.93 で固定になっています。 事情で,TCP/IP の設定を変更することができません。 マシン A から nslookup 192.168.1.93 としてもこのマシンのホスト名 が取得できません。 さて,マシン A において,以下のスクリプトを走らせました。 ---- require 'socket' require 'benchmark' result=nil Benchmark.bm do |rep| rep.report do s=TCPSocket.open("192.168.1.93", "21") result=s.peeraddr end end p result ---- 結果は以下の通り。4.5 秒ほど無駄に時間がかかっています。 ---- user system total real 0.031000 0.000000 0.031000 ( 4.531250) ["AF_INET", 21, "192.168.1.93", "192.168.1.93"] ---- ネットワークの仕組みがよく分かってないのですが,IP アドレスから ホスト名を得ることができないと TCPSocket#peeraddr に時間がかか るのかと思い,さらに調べました。 ためしに,Unix での /etc/hosts にあたるファイル C:\WINDOWS\system32\drivers\etc\hosts に ---- 192.168.1.93 pcs3 ---- と書いて再びやってみたところ,以下のように正常になりました。 ---- user system total real 0.000000 0.000000 0.000000 ( 0.125000) ["AF_INET", 21, "pcs3", "192.168.1.93"] ---- また,FTP によるファイル転送も普通の速度になりました。(パッシ ブモードの場合) これで一応解決を見ました。 なお,下記を参考にしました。 http://sonic64.com/2004-02-03.html#2004-02-03-101 しかし,釈然としないものが残ります。 素人考えなので,見当違いなら済みません。ファイル転送のために ホスト名は要りませんよね? TCPSocket#peeraddr を使わないよう にして,IP アドレスだけでも Net::FTP#put などが速く動くように できないものでしょうか? -- 5.5@moji.gr.jp