にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

UDPSocket#recvfromの逆引きタイムアウト待ちをなくす

DNSのない閉じたネットワークでUDPSocketを使ったプログラムを動作させていると、パケットが届いてからrecvfromメソッドで読み込まれるまで数秒間の遅延が発生していました。
調べたところ、Rubyのソケットではデータ受信時に送信アドレスのホスト名の逆引きを行っているようで、DNSのない環境ではそれのタイムアウト待ちが発生していたということだそうです。
以下の一行を追加すれば、その逆引きを行わないようにすることができます。

UDPSocket.do_not_reverse_lookup = true

これはUDPSocketではなく、Rubyのソケット全般(BasicSocket)で定義されているようです。

ちなみに、

Socket.do_not_reverse_lookup = true しておけば逆引きしないはずで す。1.9ならソケットごとに設定できますが、1.8では一括でしかできま せん。

[http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/43960:title=[ruby-list:43960] Re: UDPSocket#recvfromが遅い]

とのこと。