[前][次][番号順一覧][スレッド一覧]

ruby-changes:13486

From: akr <ko1@a...>
Date: Fri, 9 Oct 2009 00:02:16 +0900 (JST)
Subject: [ruby-changes:13486] Ruby:r25261 (trunk): * ext/socket/lib/socket.rb (Socket.udp_server_recv): extracted from

akr	2009-10-09 00:01:57 +0900 (Fri, 09 Oct 2009)

  New Revision: 25261

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=25261

  Log:
    * ext/socket/lib/socket.rb (Socket.udp_server_recv): extracted from
      Socket.udp_server_loop_on.

  Modified files:
    trunk/ChangeLog
    trunk/ext/socket/lib/socket.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 25260)
+++ ChangeLog	(revision 25261)
@@ -1,3 +1,8 @@
+Fri Oct  9 00:01:17 2009  Tanaka Akira  <akr@f...>
+
+	* ext/socket/lib/socket.rb (Socket.udp_server_recv): extracted from
+	  Socket.udp_server_loop_on.
+
 Thu Oct  8 05:45:14 2009  NARUSE, Yui  <naruse@r...>
 
 	* tool/enc-unicode.rb: parse range notation of UnicodeData.txt.
Index: ext/socket/lib/socket.rb
===================================================================
--- ext/socket/lib/socket.rb	(revision 25260)
+++ ext/socket/lib/socket.rb	(revision 25261)
@@ -553,6 +553,46 @@
   end
 
   # :call-seq:
+  #   Socket.udp_server_recv(sockets) {|msg, msg_src| ... }
+  #
+  # Receive UDP/IP packets from the given _sockets_.
+  # For each packet received, the block is called.
+  #
+  # The block receives _msg_ and _msg_src_.
+  # _msg_ is a string which is the payload of the received packet.
+  # _msg_src_ is a Socket::UDPSource object which is used for reply.
+  #
+  # Socket.udp_server_loop can be implemented using this method as follows.
+  #
+  #   udp_server_sockets(host, port) {|sockets|
+  #     loop {
+  #       readable, _, _ = IO.select(sockets)
+  #       udp_server_recv(readable) {|msg, msg_src| ... }
+  #     }
+  #   }
+  #
+  def self.udp_server_recv(sockets)
+    sockets.each {|r|
+      begin
+        msg, sender_addrinfo, rflags, *controls = r.recvmsg_nonblock
+      rescue IO::WaitReadable
+        next
+      end
+      ai = r.local_address
+      if ai.ipv6? and pktinfo = controls.find {|c| c.cmsg_is?(:IPV6, :PKTINFO) }
+        ai = Addrinfo.udp(pktinfo.ipv6_pktinfo_addr.ip_address, ai.ip_port)
+        yield msg, UDPSource.new(sender_addrinfo, ai) {|reply_msg|
+          r.sendmsg reply_msg, 0, sender_addrinfo, pktinfo
+        }
+      else
+        yield msg, UDPSource.new(sender_addrinfo, ai) {|reply_msg|
+          r.send reply_msg, 0, sender_addrinfo
+        }
+      end
+    }
+  end
+
+  # :call-seq:
   #   Socket.udp_server_loop_on(sockets) {|msg, msg_src| ... }
   #
   # Run UDP/IP server loop on the given sockets.
@@ -561,27 +601,10 @@
   #
   # It calls the block for each message received.
   #
-  def self.udp_server_loop_on(sockets) # :yield: msg, msg_src
+  def self.udp_server_loop_on(sockets, &b) # :yield: msg, msg_src
     loop {
       readable, _, _ = IO.select(sockets)
-      readable.each {|r|
-        begin
-          msg, sender_addrinfo, rflags, *controls = r.recvmsg_nonblock
-        rescue IO::WaitReadable
-          next
-        end
-        ai = r.local_address
-        if ai.ipv6? and pktinfo = controls.find {|c| c.cmsg_is?(:IPV6, :PKTINFO) }
-          ai = Addrinfo.udp(pktinfo.ipv6_pktinfo_addr.ip_address, ai.ip_port)
-          yield msg, UDPSource.new(sender_addrinfo, ai) {|reply_msg|
-            r.sendmsg reply_msg, 0, sender_addrinfo, pktinfo
-          }
-        else
-          yield msg, UDPSource.new(sender_addrinfo, ai) {|reply_msg|
-            r.send reply_msg, 0, sender_addrinfo
-          }
-        end
-      }
+      udp_server_recv(sockets, &b)
     }
   end
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]