渡辺哲也です。

ruby 1.7.2 2002-03-26 以降での話
です。確認しているのはいまのとこ
ろ Linux です。

socket.c 中で

udp_init()
udp_connect()
udp_bind()

などで使用されている

sock_addrinfo()

なのですが、

この関数中で

------------------------------
    hints.ai_family = PF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = flags;
------------------------------

と、固定的に SOCK_STREAM を指定し
ています。

/etc/service 中に udp の定義しか
ない場合には、サービス名からポー
ト番号がとりだせないようです。

# 該当するものがなくてもエラーに
# ならないようです? (これは追いか
# けていません)

一応確認のために、udp 系用の 
sock_addrinfo() を用意すると期待
通に動きます。

とりあえずの確認には次のスクリプ
トが使えます。

「mandelspawn」は、/etc/services 
中に udp の定義しかありません。

------------------------------
require 'socket'

udp = UDPSocket.open
port = 'mandelspawn'
host = 'localhost'

udp.bind(host, port)

sleep 10
------------------------------

でてくるエラーメッセージです
------------------------------
$ ruby udpd.rb            
udpd.rb:14:in `bind': Cannot assign requested address - "bind(2)" (Errno::EADDRNOTAVAIL)
        from udpd.rb:14
------------------------------

どこまで SOCK_STREAM でどこから 
SOCK_DGRAM にすればいいのか悩んだ
ので、パッチは作成しませんでした。
とりあえず udp のサーバを作りたかっ
たので...