[#46647] RubyでWindowsの常駐サービスプログラムを作る方法 — kouichi_someya@...

はじめまして。

12 messages 2009/12/16
[#46649] Re: RubyでWindowsの常駐サービスプログラムを作る方法 — "U.Nakamura" <usa@...> 2009/12/17

こんにちは、なかむら(う)です。

[ruby-list:46666] TCPSocket#peeraddr に時間がかかる。

From: "5.5" <5.5@...>
Date: 2009-12-19 13:45:57 UTC
List: ruby-list #46666
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

In This Thread

Prev Next