ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3945315 rubyでマルチキャスト受信するには
質問者:lakings 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)」となってしまい、実行できません。
なにか設定が必要なのでしょうか。
困り度:
  • 困っています
質問投稿日時:
08/04/13 13:34

回答

ANo.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

この辺を見ると自分でがんばるしかないんじゃないでしょうか
回答者:sakusaker7
種類:回答
どんな人:経験者
自信:参考意見
回答日時:
08/04/13 14:23
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼早速の回答ありがとうございます。引用していただいた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)」
となってしまいました。