This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.
------_ extPart_001_01C11A1F.2CECF680
Content-Type: text/plain;
charset so-8859-1"
Something I threw together a few weeks ago. It has only been tested using
Ruby 1.7.1 on Win32, but It should work on the other platforms as well. You
may have to take out the definition of the constants since they should
already be defined in socket.c. There are some some differences in the C
headers #defines of these constants, but I did not have time to look into
this and fix it on Windows.
enjoy...
- Will
<SNIP filename ulticast.rb' >
require 'socket'
#struct ip_mreq {
# struct in_addr imr_multiaddr; /* IP multicast address of group */
# struct in_addr imr_interface; /* local IP address of interface */
#};
class MulticastSocket < UDPSocket
# Some constants that are not set in Win32 version of socket.c
IPPROTO_IP
IPPROTO_UDP 7
IP_DROP_MEMBERSHIP
def convAddr(a)
h il
case a
when String
h .split('.').collect! { |b| b.to_i }.pack('CCCC')
when Array
h .pack('CCCC')
else
raise "Bad address"
end
h
end
private :convAddr
def addMembership(mcaddr)
mreq onvAddr(mcaddr) + Socket.gethostbyname(Socket.gethostname)[3]
setsockopt(IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, mreq)
end
def dropMembership(mcaddr)
mreq onvAddr(mcaddr) + Socket.gethostbyname(Socket.gethostname)[3]
setsockopt(IPPROTO_IP, IP_DROP_MEMBERSHIP, mreq)
end
def setMCTTL(ttl)
setsockopt(IPPROTO_IP, Socket::IP_MULTICAST_TTL, ttl)
end
def setMCLoop(loop)
setsockopt(IPPROTO_IP, Socket::IP_MULTICAST_LOOP, loop)
end
def setMCInterface(int)
host ocket.gethostbyname(int)[3]
setsockopt(IPPROTO_IP, Socket::IP_MULTICAST_IF, host)
end
end
if $0 __FILE__
$port 900
$addr 239.192.0.1'
sock ulticastSocket.open
sock.bind(Socket.gethostname, $port)
sock.addMembership($addr)
thread hread.start do
2.times { p sock.recvfrom(8000) }
end
sock.send('Hello', 0, $addr, $port)
sock.send('There', 0, $addr, $port)
thread.join
sock.dropMembership($addr)
end
</SNIP>
-----Original Message-----
From: Nat Pryce [mailto:nat.pryce / b13media.com]
Sent: Tuesday, July 31, 2001 5:09 AM
To: ruby-talk / ruby-lang.org
Subject: [ruby-talk:18883] IP multicast with UDPSocket
Does anyone have example code for joining/leaving multicast groups using the
UDPSocket?
Also, how is it possible to write this in a platform independent manner? As
far as I can tell, the API for setting socket options seems to be completely
platform dependent. It is also hard to code to, because you have to build
strings of binary data that contain valid C structures used by the OS APIs.
Would there be interest in code to replace or wrap setsockopt/getsockopt
with methods and attribute accessors?
For example:
socket DPSocket.new
socket.add_membership "240.212.100.200" # or whatever a valid IP group
number is
socket.ip_multicast_ttl ocket::TTL_LOCAL_NETWORK
socket.ip_multicast_loopback alse
socket.sol_reuse_address rue
socket.bind( 15630 )
Or:
socket CPSocket.new( 'www.b13media.com', 80 )
socket.sol_sndbuf 12
socket.sol_rcvbuf 096
Would this be a useful RCR?
Cheers,
Nat.
------_ extPart_001_01C11A1F.2CECF680
Content-Type: text/html;
charset so-8859-1"
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META HTTP-EQUIV
ontent-Type" CONTENT ext/html; charset o-8859-1">
<META content SHTML 5.50.4134.600" name¥Û¥Ê¥á¥Á¥ä¥Þ¥á¥»
¥·¥â¥ä¥ë¥Õ¥Ê¥»¥·¥Ã¥â¥ä¥ë¥Õ¥Ê¥»
¥·¥Ã¥Í¥Ê¥Á¥È¥»
¥·¥Ä¥Þ¥È¥ë ¥Æfffff>
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><SPAN class#4145223-31072001><FONT face ¨Âáì ãïìï°°°æ
size Something I threw together a few weeks ago. It has only been
tested using Ruby 1.7.1 on Win32, but It should work on the other
platforms as well. You may have to take out the definition of the constants
since they should already be defined in socket.c. There are some some
differences in the C headers #defines of these constants, but I did not have
time to look into this and fix it on Windows. </FONT></SPAN></DIV>
<DIV><SPAN class#4145223-31072001></SPAN><SPAN class#4145223-31072001><FONT
face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¼¯ÓÐÁξ¦îâó𻼯ÄÉÖ¾
<DIV><SPAN class#4145223-31072001></SPAN><SPAN class#4145223-31072001><FONT
face ¨Âáì ãïìï°°°æóéúå åîêïù®®®¼¯ÆÏÎÔ¾¼¯ÓÐÁξ¼¯ÄÉÖ¾
<DIV><SPAN class#4145223-31072001><FONT face ¨Âáì ãïìï°°°æ
size </FONT></SPAN> </DIV>
<DIV><SPAN class#4145223-31072001><FONT face ¨Âáì ãïìï°°°æóéúå
Will</FONT></SPAN></DIV>
<DIV><SPAN class#4145223-31072001><FONT face ¨Âáì ãïìï°°°æ
size </FONT></SPAN> </DIV>
<DIV><SPAN class#4145223-31072001><FONT face ¨Âáì ãïìï°°°æ
size <SNIP filename ulticast.rb' ></FONT></SPAN></DIV><SPAN
class#4145223-31072001>
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¼ÆÏÎÔ æáãå ¨Âáì ãïìï°°°æ
size </FONT><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¼ÆÏÎÔ æáãå ¨Âáì
color 000ff size </FONT><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¼ÆÏÎÔ
face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¼ÂÒ¾¼ÆÏÎÔ æáãå ¨Âáì ãïìï°°°æ
size require 'socket'</FONT></DIV>
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå £óôòõãéðßíòå
{<BR># struct in_addr
imr_multiaddr; /* IP multicast address of group
*/<BR># struct in_addr
imr_interface; /* local IP address of interface */<BR>#};</FONT></DIV>
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¼ÆÏÎÔ æáãå ¨Âáì ãïìï°°°æ
size </FONT><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¼ÆÏÎÔ æáãå ¨Âáì
color 000ff size </FONT><BR><FONT face ¨Âáì ãïìï°°°æóéúå ãìáó
MulticastSocket < UDPSocket</FONT></DIV>
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»Óïíå ãïîóôáîôôèáô áòîï
set in Win32 version of socket.c<BR> IPPROTO_IP <BR> IPPROTO_UDP 17<BR> IP_DROP_MEMBERSHIP </FONT></DIV>
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»äå
convAddr(a)<BR> h il<BR> case a<BR> when
String<BR> h .split('.').collect! { |b| b.to_i
}.pack('CCCC')</FONT></DIV>
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»¦îâóð»÷èåî
Array<BR> h .pack('CCCC')</FONT></DIV>
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æ
size else<BR> raise "Bad
address"<BR> end<BR> h<BR> end<BR> private
:convAddr<BR> <BR> def addMembership(mcaddr)<BR> mreq convAddr(mcaddr) +
Socket.gethostbyname(Socket.gethostname)[3]<BR> setsockopt(IPPROTO_IP,
Socket::IP_ADD_MEMBERSHIP, mreq)<BR> end</FONT></DIV>
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»äå
dropMembership(mcaddr)<BR> mreq onvAddr(mcaddr) +
Socket.gethostbyname(Socket.gethostname)[3]<BR> setsockopt(IPPROTO_IP,
IP_DROP_MEMBERSHIP, mreq)<BR> end</FONT></DIV>
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»äå
setMCTTL(ttl)<BR> setsockopt(IPPROTO_IP, Socket::IP_MULTICAST_TTL,
ttl)<BR> end</FONT></DIV>
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»äå
setMCLoop(loop)<BR> setsockopt(IPPROTO_IP, Socket::IP_MULTICAST_LOOP,
loop)<BR> end</FONT></DIV>
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»äå
setMCInterface(int)<BR> host Socket.gethostbyname(int)[3]<BR> setsockopt(IPPROTO_IP,
Socket::IP_MULTICAST_IF, host)<BR> end</FONT></DIV>
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå åî伯ÆÏÎÔ¾¼¯ÄÉÖ¾
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå éæ ¤° ß߯ÉÌÅßß¼¯ÆÏÎÔ¾¼¯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»¤ðïò ¹°°¼ÂÒ¾¦îâóð»¤áääò §²³¹®±¹²®°®±§¼¯ÆÏÎÔ¾¼¯ÄÉÖ¾
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»óïãë ÍõìôéãáóôÓïãëåô®ïðåî¼ÂÒ¾¦îâóð»óïãë®âéîä¨Óïãëåô®çåôèïóôîáíå
$port)<BR> sock.addMembership($addr)<BR> <BR> thread Thread.start do<BR> 2.times { p sock.recvfrom(8000)
}<BR> end</FONT></DIV>
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»óïãë®óåî䨧Èåìì溺 °¬ ¤áääò¬
$port)<BR> sock.send('There', 0, $addr, $port)</FONT></DIV>
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æ
size thread.join<BR> sock.dropMembership($addr)<BR>end</FONT></DIV>
<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¼ÆÏÎÔ æáãå ¨Âáì ãïìï°°°æ
size </FONT><BR><SPAN class#4145223-31072001><FONT face ¨Âáì ãïìï°°°æ
size </SNIP></FONT></SPAN></SPAN></DIV>
<BLOCKQUOTE dir r style ARGIN-RIGHT: 0px">
<DIV class tlookMessageHeader dir r align¥»¥·¥Ë¥Þ¥Û¥ä
¥å¥å¥å¥å¥å¥Þ ¥Ø¥å¥å¥å¥å¥å¥·¥Ä¥á¥»¥·¥Ä¥»¥Ë¥³¥·¥Ã¥Ä¥» ¥Û ¥ß
¥í¥³¥ç¥¿¥¢¥¦¥ç¥ó¥·¥Ä¥á¥»¥·¥Ä¥»¥â¥³¥·¥Ã¥Ä¥» ¥ä¥ã ¥Ï ¥¦¥¢¥ã ¥¤¡¼¡¼¥¢ ¥ª¥³¡¼¥±
¥Á¥Ø¥·¥Ä¥á¥»¥·¥Ä¥»¥ä¥³¥·¥Ã¥Ä¥» ¥å¥¿¥å¥ç¥·¥Ä¥á¥»¥·¥Ä¥»¥â¥³¥·¥Ã¥Ä¥» ¥í¥å¥³¥¢¥¯¥¯¥¯¥¦¥ó
¥Î¥ß ¥æ¥È¥ß¥â¥·¥Ä¥á¥»¥·¥Ä¥á¥»¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥È ¥Ã
¥æ¥È¥ß¥â¥½¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥Á¥ã
¥½¥ò¥µ ¥Á ¥Î ¥ã ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ë¥Þ¥Û¥ä
¨Â ¥Á¥ß¥Î
¥ç¥ò¥µ ¥Î ¥ò¥µ ¥ã
¥Æ ¥Þ¥â
¥Á¥ß¥Î¥ç¥ò¥µ ¥é
¥Ã ¥½¥ò¥µ
¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥Ë ¥³¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥È¥ß¥â¥ç¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥ç¡¬ ¡Ö¥¤¥¨¡¼¥ç¥¤¥¢¥¤¥ç¥¢¡¼¡¼¥ç¥¤¡¼¡¼¡Ö¥ò¥µ ¡×
¥Î¥ß ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥ç¡¬¡¬ ¥â¥³¥³¥ä¥ä¥×¥Õ¥Þ¥Æ¥Á¥×¥Û¥Ê¥ä¥é¥Þ¥á¥Ò¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥ç¡¬¡¬ ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥ç¡¬¡¬ ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥ç¥£ ¥¢¥ª¥«¥¦¡¼ ¥¥¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥Þ¥³¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥Æ¥ß¥â¥ç¥£ ¥¡¥ç¥¢¥¦¥ç¥¡¥ã ¥¯¡¼
¥¥¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥ç¡¬ ¥¢¥¤¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥ç¡¬ ¡¼¥±¥«¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥é ¥á¥Æ¥á¥½¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥Æ¥ã¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥ò¥µ¥ò¥µ¥ò¥µ ¥Û¥ç¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥»
¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥»¥·¥Ã¥Ä¥Õ¥Þ¥Æ¥Ò¥à¥æ¥Þ¥ä¥Ê¥»¥·¥Ã¥Ä¥Þ¥È¥ë¥»¥·¥Ã¥Í¥ä¥Ø¥Õ¥»
¥å¥å¥å¥å¥å¥å¡¬ ¥ß¡¬¡¼¡¼¥¢¡¬¡¼¥¢¥Æ¥¢¥¢¥Á¥¢¥Ë¥ç¥¤¥Æ¥Ê¥Æ¥Ë¥«¥¯¡¼¥å¥å