[MacRuby] #958: Errno::EAGAIN occurs when read data from socket within Webrick.

MacRuby ruby-noreply at macosforge.org
Sat Oct 16 08:55:26 PDT 2010


#958: Errno::EAGAIN occurs when read data from socket within Webrick.
----------------------------------+-----------------------------------------
 Reporter:  watson1978@…          |       Owner:  lsansonetti@…        
     Type:  defect                |      Status:  new                  
 Priority:  major                 |   Milestone:                       
Component:  MacRuby               |    Keywords:                       
----------------------------------+-----------------------------------------
 Test Script:
 {{{
 #!ruby
 # test_webrick_server.rb
 require "webrick"

 class Echo < WEBrick::GenericServer
   def run(sock)
     while line = sock.gets
       p "[server] : get = " + line
       sock.print line
     end

     p :end
   end
 end

 server = Echo.new({
   :BindAddress => "127.0.0.1", :Port => 4000,
 })

 Signal.trap('INT') { server.shutdown }
 server.start
 }}}

 {{{
 #!ruby
 # test_client.rb
 require "socket"

 host = "127.0.0.1"
 port = 4000

 c = TCPSocket.open(host, port)
 ["foo\n", "bar\n"].each do |item|
   c.print item
   p c.gets
 end

 ["1234", "aaa", "bbb"].each do |item|
   c.puts item
   p c.gets
 end
 }}}

 Result:
 {{{
 $ DYLD_LIBRARY_PATH=. ./macruby -I./lib test_webrick_server.rb
 [2010-10-17 00:43:34] INFO  WEBrick 1.3.1
 [2010-10-17 00:43:34] INFO  ruby 1.9.2 (2008-06-03) [universal-darwin10.0]
 [2010-10-17 00:43:34] INFO  Echo#start: pid=953 port=4000
 "[server] : get = foo\n"
 [2010-10-17 00:43:37] ERROR Errno::EAGAIN: Resource temporarily
 unavailable - read() failed
         /Users/watson/src/macruby-dev/test_webrick_server.rb:5:in `run:'
         /Users/watson/src/macruby-dev/lib/webrick/server.rb:183:in `block'
 }}}

 It works as expected if I do not use Webrick.
 {{{
 #!ruby
 # test_socket_server.rb
 require "socket"

 host = "127.0.0.1"
 port = 4000

 server =  TCPServer.open(port)

 s = server.accept

 while line = s.gets
   p "[server] : gets = " + line
   s.print line
 end
 }}}

 {{{
 $ DYLD_LIBRARY_PATH=. ./macruby -I./lib test_socket_server.rb
 "[server] : gets = foo\n"
 "[server] : gets = bar\n"
 "[server] : gets = 1234\n"
 "[server] : gets = aaa\n"
 "[server] : gets = bbb\n"
 }}}

-- 
Ticket URL: <http://www.macruby.org/trac/ticket/958>
MacRuby <http://macruby.org/>



More information about the macruby-tickets mailing list