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;
	charsetso-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 filenameulticast.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;
	charsetso-8859-1"

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META HTTP-EQUIV
ontent-Type" CONTENText/html; charseto-8859-1"> <META contentSHTML 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.&nbsp;It has only been tested&nbsp;using Ruby&nbsp;1.7.1 on Win32, but&nbsp;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&nbsp;some differences in the C headers #defines of these constants, but I did not have time to look into this and fix it&nbsp;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>&nbsp;</DIV> <DIV><SPAN class#4145223-31072001><FONT face ¨Âáì ãïìï°°°æóéúå Will</FONT></SPAN></DIV> <DIV><SPAN class#4145223-31072001><FONT face ¨Âáì ãïìï°°°æ size </FONT></SPAN>&nbsp;</DIV> <DIV><SPAN class#4145223-31072001><FONT face ¨Âáì ãïìï°°°æ size &lt;SNIP filenameulticast.rb' &gt;</FONT></SPAN></DIV><SPAN class#4145223-31072001> <DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¼ÆÏÎÔ æáãå ¨Âáì ãïìï°°°æ size </FONT><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¼ÆÏÎÔ æáãå ¨Âáì color000ff size </FONT><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¼ÆÏÎÔ face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¼ÂÒ¾¼ÆÏÎÔ æáãå ¨Âáì ãïìï°°°æ size require 'socket'</FONT></DIV> <DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå £óôòõãéðßíòå {<BR>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct in_addr&nbsp; imr_multiaddr;&nbsp; /* IP multicast address of group */<BR>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct in_addr&nbsp; imr_interface;&nbsp; /* local IP address of interface */<BR>#};</FONT></DIV> <DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¼ÆÏÎÔ æáãå ¨Âáì ãïìï°°°æ size </FONT><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¼ÆÏÎÔ æáãå ¨Âáì color000ff size </FONT><BR><FONT face ¨Âáì ãïìï°°°æóéúå ãìáó MulticastSocket &lt; UDPSocket</FONT></DIV> <DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»Óïíå ãïîóôáîôôèáô áòîï set in Win32 version of socket.c<BR>&nbsp;IPPROTO_IP <BR>&nbsp;IPPROTO_UDP 17<BR>&nbsp;IP_DROP_MEMBERSHIP </FONT></DIV> <DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»äå convAddr(a)<BR>&nbsp;&nbsp;h il<BR>&nbsp;&nbsp;case a<BR>&nbsp;&nbsp;when String<BR>&nbsp;&nbsp;&nbsp;h .split('.').collect! { |b| b.to_i }.pack('CCCC')</FONT></DIV> <DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»¦îâóð»÷èåî Array<BR>&nbsp;&nbsp;&nbsp;h .pack('CCCC')</FONT></DIV> <DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æ size &nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;raise "Bad address"<BR>&nbsp;&nbsp;end<BR>&nbsp;&nbsp;h<BR>&nbsp;end<BR>&nbsp;private :convAddr<BR>&nbsp;<BR>&nbsp;def addMembership(mcaddr)<BR>&nbsp;&nbsp;mreq convAddr(mcaddr) + Socket.gethostbyname(Socket.gethostname)[3]<BR>&nbsp;&nbsp;setsockopt(IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, mreq)<BR>&nbsp;end</FONT></DIV> <DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»äå dropMembership(mcaddr)<BR>&nbsp;&nbsp;mreq onvAddr(mcaddr) + Socket.gethostbyname(Socket.gethostname)[3]<BR>&nbsp;&nbsp;setsockopt(IPPROTO_IP, IP_DROP_MEMBERSHIP, mreq)<BR>&nbsp;end</FONT></DIV> <DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»äå setMCTTL(ttl)<BR>&nbsp;&nbsp;setsockopt(IPPROTO_IP, Socket::IP_MULTICAST_TTL, ttl)<BR>&nbsp;end</FONT></DIV> <DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»äå setMCLoop(loop)<BR>&nbsp;&nbsp;setsockopt(IPPROTO_IP, Socket::IP_MULTICAST_LOOP, loop)<BR>&nbsp;end</FONT></DIV> <DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»äå setMCInterface(int)<BR>&nbsp;&nbsp;host Socket.gethostbyname(int)[3]<BR>&nbsp;&nbsp;setsockopt(IPPROTO_IP, Socket::IP_MULTICAST_IF, host)<BR>&nbsp;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>&nbsp;sock.addMembership($addr)<BR>&nbsp;&nbsp;<BR>&nbsp;thread Thread.start do<BR>&nbsp;&nbsp;2.times { p sock.recvfrom(8000) }<BR>&nbsp;end</FONT></DIV> <DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¦îâóð»óïãë®óåî䨧Èåìì溺 °¬ ¤áääò¬ $port)<BR>&nbsp;sock.send('There', 0, $addr, $port)</FONT></DIV> <DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æ size &nbsp;thread.join<BR>&nbsp;sock.dropMembership($addr)<BR>end</FONT></DIV> <DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¦îâó𻼯ÄÉÖ<DIV><FONT face ¨Âáì ãïìï°°°æóéúå ¼¯ÆÏÎÔ¾¼ÆÏÎÔ æáãå ¨Âáì ãïìï°°°æ size </FONT><BR><SPAN class#4145223-31072001><FONT face ¨Âáì ãïìï°°°æ size &lt;/SNIP&gt;</FONT></SPAN></SPAN></DIV> <BLOCKQUOTE dirr styleARGIN-RIGHT: 0px"> <DIV classtlookMessageHeader dirr align¥»¥·¥Ë¥Þ¥Û¥ä ¥å¥å¥å¥å¥å¥Þ ¥Ø¥å¥å¥å¥å¥å¥·¥Ä¥á¥»¥·¥Ä¥»¥Ë¥³¥·¥Ã¥Ä¥» ¥Û ¥ß ¥í¥³¥ç¥¿¥¢¥¦¥ç¥ó¥·¥Ä¥á¥»¥·¥Ä¥»¥â¥³¥·¥Ã¥Ä¥» ¥ä¥ã ¥Ï ¥¦¥¢¥ã ¥¤¡¼¡¼¥¢ ¥ª¥³¡¼¥± ¥Á¥Ø¥·¥Ä¥á¥»¥·¥Ä¥»¥ä¥³¥·¥Ã¥Ä¥» ¥å¥¿¥å¥ç¥·¥Ä¥á¥»¥·¥Ä¥»¥â¥³¥·¥Ã¥Ä¥» ¥í¥å¥³¥¢¥¯¥¯¥¯¥¦¥ó ¥Î¥ß ¥æ¥È¥ß¥â¥·¥Ä¥á¥»¥·¥Ä¥á¥»¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥È ¥Ã ¥æ¥È¥ß¥â¥½¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥Á¥ã ¥½¥ò¥µ ¥Á ¥Î ¥ã ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥Á¥ß¥Î ¥ç¥ò¥µ ¥Î ¥ò¥µ ¥ã ¥Æ ¥Þ¥â ¥Á¥ß¥Î¥ç¥ò¥µ ¥é ¥Ã ¥½¥ò¥µ ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥Ë ¥³¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥È¥ß¥â¥ç¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥ç¡¬ ¡Ö¥¤¥¨¡¼¥ç¥¤¥¢¥¤¥ç¥¢¡¼¡¼¥ç¥¤¡¼¡¼¡Ö¥ò¥µ ¡× ¥Î¥ß ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥ç¡¬¡¬ ¥â¥³¥³¥ä¥ä¥×¥Õ¥Þ¥Æ¥Á¥×¥Û¥Ê¥ä¥é¥Þ¥á¥Ò¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥ç¡¬¡¬ ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥ç¡¬¡¬ ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥ç¥£ ¥¢¥ª¥«¥¦¡¼ ¥¥¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥Þ¥³¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥Æ¥ß¥â¥ç¥£ ¥¡¥ç¥¢¥¦¥ç¥¡¥ã ¥¯¡¼ ¥¥¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥ç¡¬ ¥¢¥¤¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥ç¡¬ ¡¼¥±¥«¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥é ¥á¥Æ¥á¥½¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥Æ¥ã¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥ò¥µ¥ò¥µ¥ò¥µ ¥Û¥ç¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥» ¥·¥È¥Î¥è¥»¥·¥Ë¥Þ¥Û¥ä ¨Â ¥·¥Ã¥Ë¥Þ¥Û¥ä¥»¥ò¥µ¥·¥Ã¥È¥Î¥è¥»¥·¥Ã¥Ä¥Õ¥Þ¥Æ¥Ò¥à¥æ¥Þ¥ä¥Ê¥»¥·¥Ã¥Ä¥Þ¥È¥ë¥»¥·¥Ã¥Í¥ä¥Ø¥Õ¥» ¥å¥å¥å¥å¥å¥å¡¬¥ß¡¬¡¼¡¼¥¢¡¬¡¼¥¢¥Æ¥¢¥¢¥Á¥¢¥Ë¥ç¥¤¥Æ¥Ê¥Æ¥Ë¥«¥¯¡¼¥å¥å