class Server
class << self
def start(config = {})
config.merge(:BindAddress => '0.0.0.0', :Port => 4321)
server = WEBrick::HTTPServer.new(config)
trap('INT') { server.shutdown }
end
end
end
Server.start
$ ruby1.9.2dev server.rb
[2009-12-08 00:21:53] INFO WEBrick 1.3.1
[2009-12-08 00:21:53] INFO ruby 1.9.2 (2009-11-14) [i686-linux]
[2009-12-08 00:21:58] WARN TCPServer Error: Permission denied - bind(2)
[2009-12-08 00:21:58] WARN TCPServer Error: Permission denied - bind(2)
/opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:73:in `initialize':
Permission denied - bind(2) (Errno::EACCES)
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:73:in
`new'
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:73:in
`block in create_listeners'
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:70:in
`each'
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:70:in
`create_listeners'
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/server.rb:74:in
`listen'
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/server.rb:62:in
`initialize'
from
/opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/httpserver.rb:24:in
`initialize'
from server.rb:24:in `new'
from server.rb:24:in `start'
from server.rb:31:in `<main>'
When I start it as a root I get another error.
# ruby1.9.2dev server.rb
[2009-12-08 00:26:18] INFO WEBrick 1.3.1
[2009-12-08 00:26:18] INFO ruby 1.9.2 (2009-11-14) [i686-linux]
[2009-12-08 00:26:23] WARN TCPServer Error: Address already in use -
bind(2)
I also get these errors while I use a stable version of Ruby (1.9.1). I
haven't got any other applications working on port 4321.
Is not a bug, it clearly indicates that another process/server is
already bound to that port.
Please verify that your script wasn't running in the background or you
using a port that is already in use by other program/service.
···
On Dec 7, 6:34 pm, "P. A." <shama...@hotmail.com> wrote:
Hi.
I get an error when I start a WEBrick server.
Here's my application.
# server.rb
# encoding: utf-8
require 'webrick'
class Server
class << self
def start(config = {})
config.merge(:BindAddress => '0.0.0.0', :Port => 4321)
server = WEBrick::HTTPServer.new(config)
trap('INT') { server.shutdown }
end
end
end
Server.start
$ ruby1.9.2dev server.rb
[2009-12-08 00:21:53] INFO WEBrick 1.3.1
[2009-12-08 00:21:53] INFO ruby 1.9.2 (2009-11-14) [i686-linux]
[2009-12-08 00:21:58] WARN TCPServer Error: Permission denied - bind(2)
[2009-12-08 00:21:58] WARN TCPServer Error: Permission denied - bind(2)
/opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:73:in `initialize':
Permission denied - bind(2) (Errno::EACCES)
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:73:in
`new'
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:73:in
`block in create_listeners'
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:70:in
`each'
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/utils.rb:70:in
`create_listeners'
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/server.rb:74:in
`listen'
from /opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/server.rb:62:in
`initialize'
from
/opt/ruby-1.9.2-dev/lib/ruby/1.9.1/webrick/httpserver.rb:24:in
`initialize'
from server.rb:24:in `new'
from server.rb:24:in `start'
from server.rb:31:in `<main>'
When I start it as a root I get another error.
# ruby1.9.2dev server.rb
[2009-12-08 00:26:18] INFO WEBrick 1.3.1
[2009-12-08 00:26:18] INFO ruby 1.9.2 (2009-11-14) [i686-linux]
[2009-12-08 00:26:23] WARN TCPServer Error: Address already in use -
bind(2)
I also get these errors while I use a stable version of Ruby (1.9.1). I
haven't got any other applications working on port 4321.
The problem was that I stated a WEBrick server without initial
configuration because I used the Hash#merge method instead Hash#merge!
(mutator).
So, the code should be changed to work properly.
# IT DOESN'T WORKS!
# encoding: utf-8
require 'webrick'
class Server
class << self
def start(config = {})
config.merge(:BindAddress => '0.0.0.0', :Port => 4321) # the error
source
puts config # returns {} on start
server = WEBrick::HTTPServer.new(config)
trap('INT') { server.shutdown }
server.start
end
end
end
# WORKS!
# encoding: utf-8
require 'webrick'
class Server
class << self
def start(config = {})
config.merge!(:BindAddress => '0.0.0.0', :Port => 4321) # changes
the config hash
puts config # returns {:BindAddress => '0.0.0.0', :Port => 4321}
on start
server = WEBrick::HTTPServer.new(config)
trap('INT') { server.shutdown }
server.start
end
end
end