dポイントプレゼントキャンペーン実施中!

WinXP、ruby1.8.6環境で、マルチキャスト受信するプログラムを作ろうと思い、Webの情報を探して以下のようにしてみました。

require "socket"
require "ipaddr"
s = UDPSocket.open()
s.bind("0.0.0.0", 10000)
mreq = IPAddr.new("X.X.X.X").hton + IPAddr.new("0.0.0.0").hton
s.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, mreq)
p s.recv(65535)
s.close

X.X.X.Xはマルチキャストアドレスです。しかし、これを実行すると、「uninitialized constant Socket::IP_ADD_MEMBERSHIP (NameError)」となってしまい、実行できません。
なにか設定が必要なのでしょうか。

A 回答 (1件)

少なくともWindows版のものではIP_ADD_MEMBERSHIPは定義されてないようです。



irb(main):016:0> Socket.constants.grep(/IP/)
=> ["AF_IPX", "IPPROTO_MAX", "IPPROTO_ICMP", "IPPROTO_UDP", "PF_IPX", "IPPORT_RESERVED", "IPPROTO_IGMP", "IPPROTO_IDP",
"IPPORT_USERRESERVED", "IPPROTO_GGP", "IPPROTO_ND", "IPPROTO_TCP", "IPPROTO_RAW", "IPPROTO_IP", "IPPROTO_PUP"]

Winsockコントロールを使用してマルチキャスト通信 - 教えて!goo
http://oshiete1.goo.ne.jp/qa2176336.html

この辺を見ると自分でがんばるしかないんじゃないでしょうか
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。引用していただいたURLを見ると、Winsockヘッダファイルを参照させて解決していたとのことですが、rubyでも同じようなことができるのでしょうか。
また、IP_ADD_MEMBERSHIPの定義は5か12だろうと思われたので、setsockoptに直接指定してみましたが、
s.setsockopt(Socket::IPPROTO_IP, 5, mreq)とすると以下のエラー
「'setsockopt':getsockoptまたはsetsockoptの呼び出しで指定されたオプションまたはレベルは、不明か、無効か、あるいはサポートされていません。(Errno::ENOPROTOOPT)」、
s.setsockopt(Socket::IPPROTO_IP, 12, mreq)とすると以下のエラー
「'setsockopt':要求したアドレスのコンテキストが無効です。(Errno::EADDRNOTAVAIL)」
となってしまいました。

お礼日時:2008/04/13 17:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!